提交 8cd3a4cc 编写于 作者: Y youyong

modify the database report

上级 04e18247
......@@ -32,6 +32,16 @@
<artifactId>codegen-maven-plugin</artifactId>
<version>1.1.5</version>
<executions>
<execution>
<id>generate database report model</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
</goals>
<configuration>
<manifest>${basedir}/src/main/resources/META-INF/dal/model/database-report-manifest.xml</manifest>
</configuration>
</execution>
<execution>
<id>generate sql report model</id>
<phase>generate-sources</phase>
......
......@@ -2,6 +2,7 @@ package com.dianping.cat.consumer;
import com.dianping.cat.consumer.common.CommonAnalyzer;
import com.dianping.cat.consumer.cross.CrossAnalyzer;
import com.dianping.cat.consumer.database.DatabaseAnalyzer;
import com.dianping.cat.consumer.dump.DumpAnalyzer;
import com.dianping.cat.consumer.event.EventAnalyzer;
import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer;
......@@ -53,6 +54,11 @@ public class DefaultAnalyzerFactory extends ContainerHolder implements AnalyzerF
} else if (name.equals("cross")) {
CrossAnalyzer analyzer = lookup(CrossAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("database")) {
DatabaseAnalyzer analyzer = lookup(DatabaseAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("common")) {
......
......@@ -10,6 +10,7 @@ import com.dianping.cat.consumer.DefaultAnalyzerFactory;
import com.dianping.cat.consumer.RealtimeConsumer;
import com.dianping.cat.consumer.common.CommonAnalyzer;
import com.dianping.cat.consumer.cross.CrossAnalyzer;
import com.dianping.cat.consumer.database.DatabaseAnalyzer;
import com.dianping.cat.consumer.dump.DumpAnalyzer;
import com.dianping.cat.consumer.dump.DumpChannelManager;
import com.dianping.cat.consumer.dump.DumpUploader;
......@@ -48,7 +49,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(MessageConsumer.class, "realtime", RealtimeConsumer.class) //
.req(AnalyzerFactory.class, LogviewUploader.class) //
.config(E("extraTime").value(property("extraTime", "180000"))//
, E("analyzers").value("problem,transaction,event,heartbeat,matrix,cross,common,dump")));
, E("analyzers").value("problem,transaction,event,heartbeat,matrix,cross,common,database,dump")));
String errorTypes = "Error,RuntimeException,Exception";
String failureTypes = "URL,SQL,Call,Cache";
......@@ -72,6 +73,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(CrossAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(DatabaseAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(MatrixAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
......
package com.dianping.cat.consumer.database;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.entity.Domain;
import com.dianping.cat.consumer.database.model.entity.Method;
import com.dianping.cat.consumer.database.model.entity.Table;
import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.consumer.database.model.transform.DefaultXmlBuilder;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> implements LogEnabled {
@Inject
private BucketManager m_bucketManager;
@Inject
private ReportDao m_reportDao;
private Map<String, DatabaseReport> m_reports = new HashMap<String, DatabaseReport>();
@Override
public void doCheckpoint(boolean atEnd) {
storeReports(atEnd);
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
@Override
public Set<String> getDomains() {
return m_reports.keySet();
}
public DatabaseReport getReport(String domain) {
DatabaseReport report = m_reports.get(domain);
if (report == null) {
report = new DatabaseReport(domain);
}
report.getDatabaseNames().addAll(m_reports.keySet());
return report;
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
Bucket<String> reportBucket = null;
try {
reportBucket = m_bucketManager.getReportBucket(m_startTime, "database");
for (String id : reportBucket.getIds()) {
String xml = reportBucket.findById(id);
DatabaseReport report = DefaultSaxParser.parse(xml);
m_reports.put(report.getDatabase(), report);
}
} catch (Exception e) {
m_logger.error(String.format("Error when loading database reports of %s!", new Date(m_startTime)), e);
} finally {
if (reportBucket != null) {
m_bucketManager.closeBucket(reportBucket);
}
}
}
@Override
protected void process(MessageTree tree) {
Message message = tree.getMessage();
if (message instanceof Transaction) {
processTransaction(tree, (Transaction) message);
}
}
private void processTransaction(MessageTree tree, Transaction t) {
String type = t.getType();
if ("SQL".equals(type)) {
DatabaseItem item = buildDataBaseItem(t);
if (item != null) {
String sqlName = t.getName();
String domainName = tree.getDomain();
String database = item.getDatabase();
String tables = item.getTables();
String method = item.getMethod();
DatabaseReport report = m_reports.get(database);
if (report == null) {
report = new DatabaseReport(database);
report.setStartTime(new Date(m_startTime));
report.setEndTime(new Date(m_startTime + MINUTE * 60 - 1));
m_reports.put(database, report);
}
report.addDomainName(tree.getDomain());
report.setConnectUrl(item.getConnectionUrl());
Domain domain = report.findOrCreateDomain(domainName);
Table allTable = domain.findOrCreateTable("All");
Table table = domain.findOrCreateTable(tables);
updateTableInfo(allTable, method, sqlName, t);
updateTableInfo(table, method, sqlName, t);
allTable.setTotalPercent(1);
table.setTotalPercent(table.getTotalCount() / (double) allTable.getTotalCount());
}
} else {
List<Message> messages = t.getChildren();
for (Message message : messages) {
if (message instanceof Transaction) {
processTransaction(tree, (Transaction) message);
}
}
}
}
private void updateTableInfo(Table table, String method, String sqlName, Transaction t) {
String status = t.getStatus();
double duration = t.getDurationInMicros() / 1000d;
Method m = table.findOrCreateMethod(method);
if (!status.equals(Message.SUCCESS)) {
m.incFailCount();
table.incFailCount();
}
m.addSql(sqlName);
m.incTotalCount();
m.setSum(m.getSum() + duration);
m.setAvg(m.getSum() / (double) m.getTotalCount());
m.setFailPercent(m.getFailCount() / (double) m.getTotalCount());
table.incTotalCount();
table.setSum(table.getSum() + duration);
table.setAvg(table.getSum() / (double) table.getTotalCount());
table.setFailPercent(table.getFailCount() / (double) table.getTotalCount());
m.setTotalPercent(m.getTotalCount() / (double) table.getTotalCount());
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
Transaction t = Cat.getProducer().newTransaction("Checkpoint", getClass().getSimpleName());
try {
reportBucket = m_bucketManager.getReportBucket(m_startTime, "database");
for (DatabaseReport report : m_reports.values()) {
Set<String> domainNames = report.getDatabaseNames();
domainNames.clear();
domainNames.addAll(getDomains());
String xml = builder.buildXml(report);
String domain = report.getDatabase();
reportBucket.storeById(domain, xml);
}
if (atEnd && !isLocalMode()) {
Date period = new Date(m_startTime);
String ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress();
for (DatabaseReport report : m_reports.values()) {
try {
Report r = m_reportDao.createLocal();
String xml = builder.buildXml(report);
String domain = report.getDatabase();
r.setName("database");
r.setDomain(domain);
r.setPeriod(period);
r.setIp(ip);
r.setType(1);
r.setContent(xml);
m_reportDao.insert(r);
// Task task = m_taskDao.createLocal();
// task.setCreationDate(new Date());
// task.setProducer(ip);
// task.setReportDomain(domain);
// task.setReportName("database");
// task.setReportPeriod(period);
// task.setStatus(1); // status todo
// m_taskDao.insert(task);
// m_logger.info("insert database task:" + task.toString());
} catch (Throwable e) {
Cat.getProducer().logError(e);
}
}
}
t.setStatus(Message.SUCCESS);
} catch (Exception e) {
Cat.getProducer().logError(e);
t.setStatus(e);
m_logger.error(String.format("Error when storing database reports of %s!", new Date(m_startTime)), e);
} finally {
t.complete();
if (reportBucket != null) {
m_bucketManager.closeBucket(reportBucket);
}
}
}
private DatabaseItem buildDataBaseItem(Transaction t) {
List<Message> messages = t.getChildren();
String connection = null;
String method = null;
String sql = (String) t.getData();
for (Message message : messages) {
if (message instanceof Event) {
String type = message.getType();
if (type.equals("SQL")) {
method = message.getName();
} else if (type.equals("SQL.database")) {
connection = message.getName();
}
}
}
if (connection != null && method != null) {
DatabaseItem item = new DatabaseItem();
String tables = getTableNamesBySql(sql);
String database = getDataBaseName(connection);
item.setDatabase(database).setTables(tables).setMethod(method).setConnectionUrl(connection);
return item;
}
return null;
}
private String getTableNamesBySql(String sql) {
try {
if (sql == null || sql.length() == 0)
sql = "TTT";
return "Table" + sql.substring(0, 6);
} catch (Exception e) {
}
return "Test";
}
private String getDataBaseName(String url) {
try {
int index = url.indexOf("://");
String temp = url.substring(index + 3);
index = temp.indexOf("/");
int index2 = temp.indexOf("?");
String schema = temp.substring(index + 1, index2 != -1 ? index2 : temp.length());
return schema;
} catch (Exception e) {
}
return "Unknown";
}
public static class DatabaseItem {
private String m_connectionUrl;
private String m_database;
private String m_tables;
private String m_method;
public String getDatabase() {
return m_database;
}
public String getConnectionUrl() {
return m_connectionUrl;
}
public DatabaseItem setConnectionUrl(String connectionUrl) {
m_connectionUrl = connectionUrl;
return this;
}
public DatabaseItem setDatabase(String database) {
m_database = database;
return this;
}
public String getTables() {
return m_tables;
}
public DatabaseItem setTables(String tables) {
m_tables = tables;
return this;
}
public String getMethod() {
return m_method;
}
public DatabaseItem setMethod(String method) {
m_method = method;
return this;
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="database-report" root="true">
<attribute name="database" value-type="String" />
<attribute name="connect-url" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="databaseName" value-type="String" type="list" names="databaseNames" />
<entity-ref name="domain" type="list" names="domains" />
</entity>
<entity name="domain">
<attribute name="id" value-type="String" />
<entity-ref name="table" type="list" names="tables" />
</entity>
<entity name="table">
<attribute name="id" value-type="String" />
<attribute name="totalCount" value-type="int" />
<attribute name="failCount" value-type="int" />
<attribute name="failPercent" value-type="double" />
<attribute name="avg" value-type="double" />
<attribute name="sum" value-type="double" />
<attribute name="tps" value-type="double" />
<entity-ref name="method" type="list" names="methods" />
</entity>
<entity name="method">
<attribute name="id" value-type="String" />
<attribute name="totalCount" value-type="int" />
<attribute name="failCount" value-type="int" />
<attribute name="failPercent" value-type="double" />
<attribute name="avg" value-type="double" />
<attribute name="sum" value-type="double" />
<attribute name="tps" value-type="double" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="database-report-codegen.xml" />
<file path="database-report-model.xml" />
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.database.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="database-report" root="true">
<attribute name="database" value-type="String" key="true"/>
<attribute name="connect-url" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="databaseName" value-type="String" type="set" names="databaseNames" />
<element name="domainName" value-type="String" type="set" names="domainNames" />
<entity-ref name="domain" type="map" names="domains" method-find-or-create="true" />
</entity>
<entity name="domain">
<attribute name="id" value-type="String" key="true"/>
<entity-ref name="table" type="map" names="tables" method-find-or-create="true" />
</entity>
<entity name="table">
<attribute name="id" value-type="String" key="true"/>
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true"/>
<attribute name="failCount" value-type="int" method-inc="true" primitive="true"/>
<attribute name="failPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="sum" value-type="double" primitive="true" format="0.00"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
<entity-ref name="method" type="map" names="methods" method-find-or-create="true"/>
</entity>
<entity name="method">
<attribute name="id" value-type="String" key="true"/>
<element name="sql" value-type="String" type="set" names="sqlNames"/>
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true"/>
<attribute name="failCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="sum" value-type="double" primitive="true" format="0.00"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
</entity>
</model>
......@@ -30,7 +30,7 @@
<attribute name="system-load-average" value-type="double" primitive="true" />
<attribute name="cat-message-produced" value-type="long" primitive="true" />
<attribute name="cat-message-overflow" value-type="long" primitive="true" />
<attribute name="cat-message-size" value-type="long" primitive="true" />
<attribute name="cat-message-size" value-type="double" primitive="true" format="0.00"/>
<entity-ref name="disk" type="list" names="disks"/>
</entity>
<entity name="disk">
......
......@@ -10,7 +10,7 @@
<implementation>com.dianping.cat.consumer.RealtimeConsumer</implementation>
<configuration>
<extraTime>180000</extraTime>
<analyzers>problem,transaction,event,heartbeat,matrix,cross,common,dump</analyzers>
<analyzers>problem,transaction,event,heartbeat,matrix,cross,common,database,dump</analyzers>
</configuration>
<requirements>
<requirement>
......@@ -109,6 +109,19 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.database.DatabaseAnalyzer</role>
<implementation>com.dianping.cat.consumer.database.DatabaseAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.matrix.MatrixAnalyzer</role>
<implementation>com.dianping.cat.consumer.matrix.MatrixAnalyzer</implementation>
......
<database-report database="CAT" connect-url="jdbc://10.1.1.220:3306/cat"
startTime="2012-06-18 14:00:00" endTime="2012-06-18 14:59:59">
<databaseName>CAT1</databaseName>
<databaseName>CAT2</databaseName>
<domain id="Cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</domain>
<domain></domain>
</database-report>
<database-report database="CAT" connect-url="jdbc://10.1.1.220:3306/cat"
startTime="2012-06-18 14:00:00" endTime="2012-06-18 14:59:59">
<databaseName>CAT1</databaseName>
<databaseName>CAT2</databaseName>
<domain id="Cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</domain>
<domain></domain>
</database-report>
<sql-report>
<sql-domain-report domain="Cat" startTime="2012-06-18 14:00:00"
endTime="2012-06-18 14:59:59">
<domain>Cat</domain>
<domain>MobileApi</domain>
<ip>10.1.77.193</ip>
<ip>10.1.77.194</ip>
<database id="CatDabase" connect-url="jdbc://10.1.1.220:3306/cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</database>
</sql-domain-report>
<sql-database-report database="CAT"
connect-url="jdbc://10.1.1.220:3306/cat" startTime="2012-06-18 14:00:00"
endTime="2012-06-18 14:59:59">
<database>CAT1</database>
<database>CAT2</database>
<domain id="Cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</domain>
<domain></domain>
</sql-database-report>
<sql-report domain="Cat" startTime="2012-06-18 14:00:00"
endTime="2012-06-18 14:59:59">
<domain>Cat</domain>
<domain>MobileApi</domain>
<database id="CatDabase" connect-url="jdbc://10.1.1.220:3306/cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</database>
</sql-report>
......
<sql-report>
<sql-domain-report domain="Cat" startTime="2012-06-18 14:00:00"
endTime="2012-06-18 14:59:59">
<domainName>Cat</domainName>
<domainName>MobileApi</domainName>
<database id="CatDabase" connect-url="jdbc://10.1.1.220:3306/cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</database>
</sql-domain-report>
<sql-database-report database="CAT"
connect-url="jdbc://10.1.1.220:3306/cat" startTime="2012-06-18 14:00:00"
endTime="2012-06-18 14:59:59">
<databaseName>CAT1</databaseName>
<databaseName>CAT2</databaseName>
<domain id="Cat">
<table id="HostInfo" totalCount="111507" failCount="0"
failPercent="0.00" avg="0.0" sum="1937.0" tps="0.00">
<method id="select" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
<method id="insert" totalCount="1" failCount="0" failPercent="0.00"
avg="0.0" sum="0.9" tps="0.00"></method>
</table>
<table></table>
</domain>
<domain></domain>
</sql-database-report>
</sql-report>
......@@ -22,6 +22,8 @@ import com.dianping.cat.report.task.ReportFacade;
import com.dianping.cat.report.task.TaskConsumer;
import com.dianping.cat.report.task.cross.CrossMerger;
import com.dianping.cat.report.task.cross.CrossReportBuilder;
import com.dianping.cat.report.task.database.DatabaseMerger;
import com.dianping.cat.report.task.database.DatabaseReportBuilder;
import com.dianping.cat.report.task.event.EventGraphCreator;
import com.dianping.cat.report.task.event.EventMerger;
import com.dianping.cat.report.task.event.EventReportBuilder;
......@@ -75,6 +77,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(ProblemMerger.class));
all.add(C(HeartbeatMerger.class));
all.add(C(CrossMerger.class));
all.add(C(DatabaseMerger.class));
all.add(C(TransactionReportBuilder.class) //
.req(GraphDao.class, ReportDao.class, DailyreportDao.class, TransactionGraphCreator.class,
......@@ -93,6 +96,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(MatrixReportBuilder.class) //
.req(GraphDao.class, ReportDao.class, DailyreportDao.class, MatrixMerger.class));
all.add(C(DatabaseReportBuilder.class) //
.req(GraphDao.class, ReportDao.class, DailyreportDao.class, DatabaseMerger.class));
all.add(C(CrossReportBuilder.class) //
.req(GraphDao.class, ReportDao.class, DailyreportDao.class, CrossMerger.class));
......
......@@ -13,6 +13,9 @@ import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.report.page.model.cross.CompositeCrossService;
import com.dianping.cat.report.page.model.cross.HistoricalCrossService;
import com.dianping.cat.report.page.model.cross.LocalCrossService;
import com.dianping.cat.report.page.model.database.CompositeDatabaseService;
import com.dianping.cat.report.page.model.database.HistoricalDatabaseService;
import com.dianping.cat.report.page.model.database.LocalDatabaseService;
import com.dianping.cat.report.page.model.event.CompositeEventService;
import com.dianping.cat.report.page.model.event.HistoricalEventService;
import com.dianping.cat.report.page.model.event.LocalEventService;
......@@ -102,6 +105,15 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
.req(ServerConfigManager.class) //
.req(ModelService.class, new String[] { "cross-historical" }, "m_services"));
all.add(C(ModelService.class, "database-local", LocalDatabaseService.class) //
.req(BucketManager.class, ReportDao.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "database-historical", HistoricalDatabaseService.class) //
.req(BucketManager.class, ReportDao.class));
all.add(C(ModelService.class, "database", CompositeDatabaseService.class) //
.req(ServerConfigManager.class) //
.req(ModelService.class, new String[] { "database-historical" }, "m_services"));
all.add(C(ModelService.class, "ip-local", LocalIpService.class) //
.req(BucketManager.class) //
.req(MessageConsumer.class, "realtime"));
......
......@@ -2,4 +2,6 @@ package com.dianping.cat.helper;
public class CatString {
public static final String ALL_IP = "All";
public static final String ALL_Domain = "All";
}
......@@ -37,7 +37,9 @@ com.dianping.cat.report.page.monthreport.Handler.class,
com.dianping.cat.report.page.cross.Handler.class,
com.dianping.cat.report.page.cache.Handler.class
com.dianping.cat.report.page.cache.Handler.class,
com.dianping.cat.report.page.database.Handler.class
})
public class ReportModule extends AbstractModule {
......
......@@ -35,7 +35,9 @@ public enum ReportPage implements Page {
CROSS("cross", "cross", "Cross", "Cross", true),
CACHE("cache", "cache", "Cache", "Cache", true);
CACHE("cache", "cache", "Cache", "Cache", true),
DATABASE("database", "database", "Database", "Database", true);
private String m_name;
......
package com.dianping.cat.report.page.database;
public enum Action implements com.site.web.mvc.Action {
HOURLY_REPORT("hourly"),
HISTORY_REPORT("history");
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
if (action.getName().equals(name)) {
return action;
}
}
return defaultAction;
}
private String m_name;
private Action(String name) {
m_name = name;
}
@Override
public String getName() {
return m_name;
}
}
package com.dianping.cat.report.page.database;
import com.dianping.cat.report.ReportContext;
public class Context extends ReportContext<Payload> {
}
package com.dianping.cat.report.page.database;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.dianping.cat.consumer.database.model.entity.Table;
import com.dianping.cat.consumer.database.model.transform.BaseVisitor;
public class DisplayDatabase extends BaseVisitor {
private String m_sortBy = "name";
private List<Table> m_results = new ArrayList<Table>();
public List<Table> getResults() {
Collections.sort(m_results, new TableCompartor(m_sortBy));
return m_results;
}
public DisplayDatabase setSortBy(String sortBy) {
if (!StringUtils.isEmpty(sortBy)) {
m_sortBy = sortBy;
}
return this;
}
@Override
public void visitTable(Table table) {
m_results.add(table);
}
public static class TableCompartor implements Comparator<Table> {
private String m_sorted;
public TableCompartor(String sort) {
m_sorted = sort;
}
@Override
public int compare(Table m1, Table m2) {
if (m1.getId() != null && m1.getId().startsWith("All")) {
return -1;
}
if (m2.getId() != null && m2.getId().startsWith("All")) {
return 1;
}
if (m_sorted.equals("name")) {
return m1.getId().compareTo(m2.getId());
}
if (m_sorted.equals("total")) {
return (int) (m2.getTotalCount() - m1.getTotalCount());
}
if (m_sorted.equals("failure")) {
return (int) (m2.getFailCount() - m1.getFailCount());
}
if (m_sorted.equals("failurePercent")) {
return (int) (m2.getFailPercent() * 1000 - m1.getFailPercent() * 1000);
}
if (m_sorted.equals("avg")) {
return (int) (m2.getAvg() * 1000 - m1.getAvg() * 1000);
}
return 0;
}
}
}
package com.dianping.cat.report.page.database;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.servlet.ServletException;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.DailyreportDao;
import com.dianping.cat.hadoop.dal.DailyreportEntity;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.model.database.DatabaseReportMerger;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.database.DatabaseMerger;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
import com.site.lookup.util.StringUtils;
import com.site.web.mvc.PageHandler;
import com.site.web.mvc.annotation.InboundActionMeta;
import com.site.web.mvc.annotation.OutboundActionMeta;
import com.site.web.mvc.annotation.PayloadMeta;
/**
* @author youyong
*/
public class Handler implements PageHandler<Context> {
public static final long ONE_HOUR = 3600 * 1000L;
@Inject
protected ReportDao m_reportDao;
@Inject
private DatabaseMerger m_databaseMerger;
@Inject
private DailyreportDao m_dailyreportDao;
@Inject
private JspViewer m_jspViewer;
@Inject
private ServerConfigManager m_manager;
@Inject(type = ModelService.class, value = "database")
private ModelService<DatabaseReport> m_service;
private DatabaseReport getHourlyReport(Payload payload) {
String domain = payload.getDomain();
String date = String.valueOf(payload.getDate());
String ipAddress = payload.getIpAddress();
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("date", date) //
.setProperty("ip", ipAddress)//
.setProperty("database", payload.getDatabase());
if (m_service.isEligable(request)) {
ModelResponse<DatabaseReport> response = m_service.invoke(request);
DatabaseReport report = response.getModel();
return report;
} else {
throw new RuntimeException("Internal error: no eligable database service registered for " + request + "!");
}
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "database")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "database")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
normalize(model, payload);
switch (payload.getAction()) {
case HISTORY_REPORT:
DatabaseReport historyReport = showSummarizeReport(model, payload);
DisplayDatabase displayHistoryDatabase = new DisplayDatabase();
displayHistoryDatabase.setSortBy(payload.getSortBy()).visitDatabaseReport(historyReport);
model.setReport(historyReport);
model.setDisplayDatabase(displayHistoryDatabase);
break;
case HOURLY_REPORT:
DatabaseReport hourlyReport = getHourlyReport(payload);
DisplayDatabase displayDatabase = new DisplayDatabase();
displayDatabase.setSortBy(payload.getSortBy()).visitDatabaseReport(hourlyReport);
model.setReport(hourlyReport);
model.setDisplayDatabase(displayDatabase);
break;
}
m_jspViewer.view(ctx, model);
}
public void normalize(Model model, Payload payload) {
Action action = payload.getAction();
model.setAction(action);
model.setPage(ReportPage.DATABASE);
if (StringUtils.isEmpty(payload.getDomain())) {
payload.setDomain("All");
}
if (StringUtils.isEmpty(payload.getDatabase())) {
payload.setDatabase("cat");
}
model.setDatabase(payload.getDatabase());
model.setDisplayDomain(payload.getDomain());
model.setDomain(payload.getDomain());
if (payload.getPeriod().isFuture()) {
model.setLongDate(payload.getCurrentDate());
} else {
model.setLongDate(payload.getDate());
}
if (action == Action.HISTORY_REPORT) {
String type = payload.getReportType();
if (type == null || type.length() == 0) {
payload.setReportType("day");
}
model.setReportType(payload.getReportType());
payload.computeStartDate();
if (!payload.isToday()) {
payload.setYesterdayDefault();
}
model.setLongDate(payload.getDate());
model.setCustomDate(payload.getHistoryStartDate(), payload.getHistoryEndDate());
}
}
private DatabaseReport showSummarizeReport(Model model, Payload payload) {
String domain = payload.getDomain();
DatabaseReport databaseReport = null;
Date start = payload.getHistoryStartDate();
Date end = payload.getHistoryEndDate();
Date currentDayStart = TaskHelper.todayZero(new Date());
if (currentDayStart.getTime() == start.getTime()) {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "database",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
for (Report report : allReports) {
domains.add(report.getDomain());
}
databaseReport = m_databaseMerger.mergeForDaily(domain, reports, domains);
} catch (DalException e) {
Cat.logError(e);
}
} else {
try {
List<Dailyreport> reports = m_dailyreportDao.findAllByDomainNameDuration(start, end, domain, "database",
DailyreportEntity.READSET_FULL);
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(domain));
for (Dailyreport report : reports) {
String xml = report.getContent();
DatabaseReport reportModel = DefaultSaxParser.parse(xml);
reportModel.accept(merger);
}
databaseReport = merger.getDatabaseReport();
} catch (Exception e) {
Cat.logError(e);
}
}
databaseReport.setStartTime(start);
databaseReport.setEndTime(end);
return databaseReport;
}
}
package com.dianping.cat.report.page.database;
public enum JspFile {
HOURLY("/jsp/report/database.jsp"),
HISTORY("/jsp/report/databaseHistory.jsp")
;
private String m_path;
private JspFile(String path) {
m_path = path;
}
public String getPath() {
return m_path;
}
}
package com.dianping.cat.report.page.database;
import com.dianping.cat.report.ReportPage;
import com.site.web.mvc.view.BaseJspViewer;
public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model> {
@Override
protected String getJspFilePath(Context ctx, Model model) {
Action action = model.getAction();
switch (action) {
case HOURLY_REPORT:
return JspFile.HOURLY.getPath();
case HISTORY_REPORT:
return JspFile.HISTORY.getPath();
}
throw new RuntimeException("Unknown action: " + action);
}
}
package com.dianping.cat.report.page.database;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.view.StringSortHelper;
public class Model extends AbstractReportModel<Action, Context> {
private DatabaseReport m_report;
private DisplayDatabase m_displayDatabase;
private String m_ipAddress;
private String m_domain;
private String m_database;
public Model(Context ctx) {
super(ctx);
}
public String getDatabase() {
return m_database;
}
public Collection<String> getDatabases() {
if (m_report == null) {
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add(getDatabase());
return arrayList;
} else {
Set<String> domainNames = m_report.getDatabaseNames();
domainNames.add(getDatabase());
return StringSortHelper.sortDomain(domainNames);
}
}
@Override
public Action getDefaultAction() {
return Action.HOURLY_REPORT;
}
public DisplayDatabase getDisplayDatabase() {
return m_displayDatabase;
}
@Override
public String getDomain() {
return m_domain;
}
public List<String> getDomains() {
if (m_report == null) {
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add(getDomain());
return arrayList;
} else {
Set<String> domainNames = m_report.getDomainNames();
return StringSortHelper.sortDomain(domainNames);
}
}
public String getIpAddress() {
return m_ipAddress;
}
public List<String> getIps() {
if (m_report == null) {
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add(getDomain());
return arrayList;
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
public DatabaseReport getReport() {
return m_report;
}
public void setDatabase(String database) {
m_database = database;
}
public void setDisplayDatabase(DisplayDatabase displayDatabase) {
m_displayDatabase = displayDatabase;
}
public void setDomain(String domain) {
m_domain = domain;
}
public void setIpAddress(String ipAddress) {
m_ipAddress = ipAddress;
}
public void setReport(DatabaseReport report) {
m_report = report;
}
}
package com.dianping.cat.report.page.database;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.AbstractReportPayload;
import com.site.web.mvc.ActionContext;
import com.site.web.mvc.payload.annotation.FieldMeta;
public class Payload extends AbstractReportPayload<Action> {
private ReportPage m_page;
@FieldMeta("sort")
private String sortBy;
@FieldMeta("op")
private Action m_action;
@FieldMeta("database")
private String m_database;
public Payload() {
super(ReportPage.DATABASE);
}
@Override
public Action getAction() {
return m_action;
}
public String getDatabase() {
return m_database;
}
@Override
public ReportPage getPage() {
return m_page;
}
public String getSortBy() {
return sortBy;
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.HOURLY_REPORT);
}
public void setDatabase(String database) {
m_database = database;
}
@Override
public void setPage(String page) {
m_page = ReportPage.getByName(page, ReportPage.DATABASE);
}
public void setSortBy(String sortBy) {
this.sortBy = sortBy;
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.getByName("hourly", Action.HOURLY_REPORT);
}
}
}
......@@ -92,8 +92,8 @@ public class DisplayHeartbeat {
m_httpThreads[minute] = period.getHttpThreadCount();
m_catMessageProduced[minute] = period.getCatMessageProduced();
m_catMessageOverflow[minute] = period.getCatMessageOverflow();
period.setCatMessageSize(period.getCatMessageSize() / K / K);
m_catMessageSize[minute] = (double) period.getCatMessageSize() / K / K;
period.setCatMessageSize((double)(period.getCatMessageSize() / K / K));
m_catMessageSize[minute] = period.getCatMessageSize();
m_newGcCount[minute] = period.getNewGcCount();
m_oldGcCount[minute] = period.getOldGcCount();
......
......@@ -35,8 +35,6 @@ import com.site.web.mvc.annotation.PayloadMeta;
public class Handler implements PageHandler<Context> {
public static final double NOTEXIST = -1;
public static final long ONE_HOUR = 3600 * 1000L;
@Inject
......
......@@ -8,6 +8,7 @@ import javax.servlet.ServletException;
import org.apache.commons.lang.StringUtils;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.database.model.entity.Domain;
import com.dianping.cat.consumer.event.model.entity.EventName;
import com.dianping.cat.consumer.event.model.entity.EventType;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
......@@ -24,6 +25,7 @@ import com.dianping.cat.helper.CatString;
import com.dianping.cat.message.internal.MessageId;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.model.cross.LocalCrossService;
import com.dianping.cat.report.page.model.database.LocalDatabaseService;
import com.dianping.cat.report.page.model.event.LocalEventService;
import com.dianping.cat.report.page.model.heartbeat.LocalHeartbeatService;
import com.dianping.cat.report.page.model.ip.LocalIpService;
......@@ -74,6 +76,9 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
@Inject(type = ModelService.class, value = "cross-local")
private LocalCrossService m_crossService;
@Inject(type = ModelService.class, value = "database-local")
private LocalDatabaseService m_databaseService;
private String doFilter(Payload payload, Object dataModel) {
String report = payload.getReport();
String ipAddress = payload.getIpAddress();
......@@ -100,7 +105,13 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
HeartBeatReportFilter filter = new HeartBeatReportFilter(ipAddress);
return filter.buildXml((com.dianping.cat.consumer.heartbeat.model.IEntity<?>) dataModel);
} else {
} else if("database".equals(report)){
String domain = payload.getDomain();
DatabaseReportFilter filter = new DatabaseReportFilter(domain);
return filter.buildXml((com.dianping.cat.consumer.database.model.IEntity<?>) dataModel);
}
else {
return String.valueOf(dataModel);
}
}
......@@ -159,6 +170,10 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
response = m_matrixService.invoke(request);
} else if ("cross".equals(report)) {
response = m_crossService.invoke(request);
} else if ("database".equals(report)) {
String databaseName = payload.getDatabase();
ModelRequest database = new ModelRequest(databaseName, payload.getPeriod());
response = m_databaseService.invoke(database);
} else {
throw new RuntimeException("Unsupported report: " + report + "!");
}
......@@ -371,4 +386,21 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
}
}
}
static class DatabaseReportFilter extends com.dianping.cat.consumer.database.model.transform.DefaultXmlBuilder {
private String m_domain;
public DatabaseReportFilter(String domain) {
m_domain = domain;
}
@Override
public void visitDomain(Domain domain) {
String id = domain.getId();
if (m_domain.equals("All") || m_domain.equals(id)) {
super.visitDomain(domain);
}
}
}
}
......@@ -40,6 +40,9 @@ public class Payload implements ActionPayload<ReportPage, Action> {
@FieldMeta("type")
private String m_type;
@FieldMeta("database")
private String m_database;
@Override
public Action getAction() {
return m_action;
......@@ -147,6 +150,14 @@ public class Payload implements ActionPayload<ReportPage, Action> {
m_type = type;
}
public String getDatabase() {
return m_database;
}
public void setDatabase(String database) {
m_database = database;
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
......
package com.dianping.cat.report.page.model.database;
import java.util.List;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.internal.BaseCompositeModelService;
import com.dianping.cat.report.page.model.spi.internal.BaseRemoteModelService;
public class CompositeDatabaseService extends BaseCompositeModelService<DatabaseReport> {
public CompositeDatabaseService() {
super("database");
}
@Override
protected BaseRemoteModelService<DatabaseReport> createRemoteService() {
return new RemoteDatabaseService();
}
@Override
protected DatabaseReport merge(ModelRequest request, List<ModelResponse<DatabaseReport>> responses) {
if (responses.size() == 0) {
return null;
}
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(request.getProperty("database")));
String domain = request.getDomain();
if(domain.equals(CatString.ALL_Domain)){
merger.setAllDomain(true);
}
for (ModelResponse<DatabaseReport> response : responses) {
DatabaseReport model = response.getModel();
if (model != null) {
model.accept(merger);
}
}
return merger.getDatabaseReport();
}
}
package com.dianping.cat.report.page.model.database;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.entity.Domain;
import com.dianping.cat.consumer.database.model.entity.Method;
import com.dianping.cat.consumer.database.model.entity.Table;
import com.dianping.cat.consumer.database.model.transform.DefaultMerger;
import com.dianping.cat.helper.CatString;
public class DatabaseReportMerger extends DefaultMerger {
private boolean m_allDomain = false;
private Domain m_all;
public DatabaseReportMerger(DatabaseReport databaseReport) {
super(databaseReport);
}
@Override
public void visitDomain(Domain domain) {
if (m_allDomain) {
visitDomainChildren(m_all, domain);
} else {
super.visitDomain(domain);
}
}
@Override
protected void mergeTable(Table old, Table table) {
double sum = 0;
if (old.getTotalPercent() > 0) {
sum += old.getTotalCount() / old.getTotalPercent();
}
if (table.getTotalPercent() > 0) {
sum += table.getTotalCount() / table.getTotalPercent();
}
old.setTotalPercent((old.getTotalCount() + table.getTotalCount()) / sum);
old.setTotalCount(old.getTotalCount() + table.getTotalCount());
old.setFailCount(old.getFailCount() + table.getFailCount());
old.setFailPercent(old.getFailCount() / (double) old.getTotalCount());
old.setSum(old.getSum() + table.getSum());
old.setAvg(old.getSum() / (double) old.getTotalCount());
}
@Override
protected void mergeMethod(Method old, Method method) {
double sum = 0;
if (old.getTotalPercent() > 0) {
sum += old.getTotalCount() / old.getTotalPercent();
}
if (method.getTotalPercent() > 0) {
sum += method.getTotalCount() / method.getTotalPercent();
}
old.setTotalPercent((old.getTotalCount() + method.getTotalCount()) / sum);
old.setTotalCount(old.getTotalCount() + method.getTotalCount());
old.setFailCount(old.getFailCount() + method.getFailCount());
old.setFailPercent(old.getFailCount() / (double) old.getTotalCount());
old.setSum(old.getSum() + method.getSum());
old.setAvg(old.getSum() / (double) old.getTotalCount());
}
@Override
protected void mergeDatabaseReport(DatabaseReport old, DatabaseReport databaseReport) {
old.getDomainNames().addAll(databaseReport.getDomainNames());
old.getDatabaseNames().addAll(databaseReport.getDatabaseNames());
super.mergeDatabaseReport(old, databaseReport);
}
@Override
public void visitDatabaseReport(DatabaseReport databaseReport) {
DatabaseReport old = getDatabaseReport();
if (m_allDomain) {
m_all = old.findOrCreateDomain(CatString.ALL_Domain);
}
super.visitDatabaseReport(databaseReport);
old.getDomainNames().addAll(databaseReport.getDomainNames());
old.getDatabaseNames().addAll(databaseReport.getDatabaseNames());
if(m_allDomain){
old.getDomainNames().remove(CatString.ALL_Domain);
}
}
public void setAllDomain(boolean allDomain) {
m_allDomain = true;
}
}
package com.dianping.cat.report.page.model.database;
import java.util.Date;
import java.util.List;
import java.util.Set;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.internal.BaseHistoricalModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class HistoricalDatabaseService extends BaseHistoricalModelService<DatabaseReport> {
@Inject
private BucketManager m_bucketManager;
@Inject
private ReportDao m_reportDao;
public HistoricalDatabaseService() {
super("database");
}
@Override
protected DatabaseReport buildModel(ModelRequest request) throws Exception {
String domain = request.getDomain();
long date = Long.parseLong(request.getProperty("date"));
DatabaseReport report;
if (isLocalMode()) {
report = getReportFromLocalDisk(date, domain);
} else {
report = getReportFromDatabase(date, domain);
}
return report;
}
private DatabaseReport getReportFromDatabase(long timestamp, String domain) throws Exception {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(new Date(timestamp), domain, 1, getName(),
ReportEntity.READSET_FULL);
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(domain));
for (Report report : reports) {
String xml = report.getContent();
DatabaseReport model = DefaultSaxParser.parse(xml);
model.accept(merger);
}
DatabaseReport databaseReport = merger.getDatabaseReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
if (databaseReport == null) {
databaseReport = new DatabaseReport(domain);
}
Set<String> dataBaseNames = databaseReport.getDatabaseNames();
for (Report report : historyReports) {
dataBaseNames.add(report.getDomain());
}
return databaseReport;
}
private DatabaseReport getReportFromLocalDisk(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "database");
String xml = bucket.findById(domain);
return xml == null ? null : DefaultSaxParser.parse(xml);
}
}
package com.dianping.cat.report.page.model.database;
import java.util.Date;
import java.util.List;
import java.util.Set;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class LocalDatabaseService extends BaseLocalModelService<DatabaseReport> {
@Inject
private BucketManager m_bucketManager;
@Inject
private ReportDao m_reportDao;
public LocalDatabaseService() {
super("database");
}
private DatabaseReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "database");
String xml = bucket.findById(domain);
return xml == null ? null : DefaultSaxParser.parse(xml);
}
@Override
protected DatabaseReport getReport(ModelRequest request, ModelPeriod period, String domain) throws Exception {
DatabaseReport report = super.getReport(request, period, domain);
if (report == null && period.isLast()) {
long current = System.currentTimeMillis();
long hour = 60 * 60 * 1000;
long date = current - current % (hour) - hour;
report = getLocalReport(date, domain);
if (report == null) {
report = new DatabaseReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
Set<String> databaseNames = report.getDatabaseNames();
for (Report temp : historyReports) {
databaseNames.add(temp.getDomain());
}
}
}
return report;
}
}
package com.dianping.cat.report.page.model.database;
import java.io.IOException;
import org.xml.sax.SAXException;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.report.page.model.spi.internal.BaseRemoteModelService;
public class RemoteDatabaseService extends BaseRemoteModelService<DatabaseReport> {
public RemoteDatabaseService() {
super("database");
}
@Override
protected DatabaseReport buildModel(String xml) throws SAXException, IOException {
return DefaultSaxParser.parse(xml);
}
}
package com.dianping.cat.report.task.database;
import java.util.Date;
import java.util.List;
import java.util.Set;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.database.DatabaseReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
public class DatabaseMerger implements ReportMerger<DatabaseReport> {
@Override
public DatabaseReport mergeForDaily(String reportDomain, List<Report> reports, Set<String> domains) {
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(reportDomain));
for (Report report : reports) {
String xml = report.getContent();
try {
DatabaseReport model = DefaultSaxParser.parse(xml);
model.accept(merger);
} catch (Exception e) {
Cat.logError(e);
}
}
DatabaseReport databaseReport = merger.getDatabaseReport();
Date date = databaseReport.getStartTime();
Date end = new Date(TaskHelper.tomorrowZero(date).getTime() - 1000);
databaseReport.getDatabaseNames().addAll(domains);
databaseReport.setStartTime(TaskHelper.todayZero(date));
databaseReport.setEndTime(end);
return databaseReport;
}
@Override
public DatabaseReport mergeForGraph(String reportDomain, List<Report> reports) {
throw new RuntimeException("Database report don't need graph!");
}
}
package com.dianping.cat.report.task.database;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
public class DatabaseReportBuilder extends AbstractReportBuilder implements ReportBuilder {
@Inject
private DatabaseMerger m_databaseMerger;
@Override
public boolean buildDailyReport(String reportName, String reportDomain, Date reportPeriod) {
try {
Dailyreport report = getdailyReport(reportName, reportDomain, reportPeriod);
m_dailyReportDao.insert(report);
return true;
} catch (Exception e) {
Cat.logError(e);
return false;
}
}
private Dailyreport getdailyReport(String reportName, String reportDomain, Date reportPeriod) throws DalException {
Date endDate = TaskHelper.tomorrowZero(reportPeriod);
Set<String> domainSet = new HashSet<String>();
getDomainSet(domainSet, reportPeriod, endDate);
List<Report> reports = m_reportDao.findAllByDomainNameDuration(reportPeriod, endDate, reportDomain, reportName,
ReportEntity.READSET_FULL);
String content = m_databaseMerger.mergeForDaily(reportDomain, reports, domainSet).toString();
Dailyreport report = m_dailyReportDao.createLocal();
report.setContent(content);
report.setCreationDate(new Date());
report.setDomain(reportDomain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(reportName);
report.setPeriod(reportPeriod);
report.setType(1);
return report;
}
@Override
public boolean buildHourReport(String reportName, String reportDomain, Date reportPeriod){
throw new RuntimeException("Database report don't support HourReport!");
}
@Override
public boolean redoDailyReport(String reportName, String reportDomain, Date reportPeriod) {
try {
Dailyreport report = getdailyReport(reportName, reportDomain, reportPeriod);
clearDailyReport(report);
m_dailyReportDao.insert(report);
return true;
} catch (Exception e) {
Cat.logError(e);
return false;
}
}
@Override
public boolean redoHourReport(String reportName, String reportDomain, Date reportPeriod) {
throw new RuntimeException("Database report don't support redo HourReport!");
}
}
......@@ -33,7 +33,9 @@ public class NavigationBar {
ReportPage.LOGVIEW,
ReportPage.MONTHREPORT
ReportPage.MONTHREPORT,
ReportPage.DATABASE
};
}
......
......@@ -86,6 +86,10 @@
<role>com.dianping.cat.report.task.cross.CrossMerger</role>
<implementation>com.dianping.cat.report.task.cross.CrossMerger</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.database.DatabaseMerger</role>
<implementation>com.dianping.cat.report.task.database.DatabaseMerger</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.transaction.TransactionReportBuilder</role>
<implementation>com.dianping.cat.report.task.transaction.TransactionReportBuilder</implementation>
......@@ -188,6 +192,24 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.database.DatabaseReportBuilder</role>
<implementation>com.dianping.cat.report.task.database.DatabaseReportBuilder</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.GraphDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.DailyreportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.database.DatabaseMerger</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.cross.CrossReportBuilder</role>
<implementation>com.dianping.cat.report.task.cross.CrossReportBuilder</implementation>
......@@ -530,6 +552,53 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>database-local</role-hint>
<implementation>com.dianping.cat.report.page.model.database.LocalDatabaseService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>database-historical</role-hint>
<implementation>com.dianping.cat.report.page.model.database.HistoricalDatabaseService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>database</role-hint>
<implementation>com.dianping.cat.report.page.model.database.CompositeDatabaseService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hints>
<role-hint>database-historical</role-hint>
</role-hints>
<field-name>m_services</field-name>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>ip-local</role-hint>
......@@ -1082,6 +1151,11 @@
<role-hint>cross-local</role-hint>
<field-name>m_crossService</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>database-local</role-hint>
<field-name>m_databaseService</field-name>
</requirement>
</requirements>
</component>
<component>
......@@ -1241,6 +1315,23 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.database.LocalDatabaseService</role>
<implementation>com.dianping.cat.report.page.model.database.LocalDatabaseService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
<field-name>m_consumer</field-name>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.sql.Handler</role>
<implementation>com.dianping.cat.report.page.sql.Handler</implementation>
......@@ -1663,5 +1754,39 @@
<role>com.dianping.cat.report.page.cache.JspViewer</role>
<implementation>com.dianping.cat.report.page.cache.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.database.Handler</role>
<implementation>com.dianping.cat.report.page.database.Handler</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.database.DatabaseMerger</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.DailyreportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.database.JspViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>database</role-hint>
<field-name>m_service</field-name>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.database.DatabaseMerger</role>
<implementation>com.dianping.cat.report.task.database.DatabaseMerger</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.database.JspViewer</role>
<implementation>com.dianping.cat.report.page.database.JspViewer</implementation>
</component>
</components>
</plexus>
......@@ -50,6 +50,9 @@
<page name="cache" title="Cache" path="cache">
<description>Cache</description>
</page>
<page name="database" title="Database" path="database">
<description>Database</description>
</page>
</module>
</webapp>
</wizard>
......
.database {
font-size: small;
min-width:50%;
}
.database tr th{
text-align:right;
}
.database .odd td {
background-color: #eee;
font-size: small;
text-align:right;
}
.database .even td {
background-color: white;
font-size: small;
text-align:right;
}
.database th .left{
text-align:left;
}
.database tr .left{
text-align:left;
}
.database tr .left{
text-align:left;
}
\ No newline at end of file
<%@ page session="false" language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.database.Context" scope="request" />
<jsp:useBean id="payload" type="com.dianping.cat.report.page.database.Payload" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.database.Model" scope="request" />
<c:set var="report" value="${model.report}" />
<a:body>
<res:bean id="res" />
<res:useCss value='${res.css.local.body_css}' target="head-css" />
<res:useCss value='${res.css.local.report_css}' target="head-css" />
<res:useCss value="${res.css.local.database_css}" target="head-css" />
<res:useJs value="${res.js.local['jquery-1.7.1.js']}" target="head-js" />
<div class="report">
<table class="header">
<tr>
<td class="title">&nbsp;&nbsp; DatabaseReport</td>
<td class="switch"><a
href="${model.baseUri}?op=history&database=${model.database}">Switch
To History Mode</a></td>
<td class="nav"><c:forEach var="nav" items="${model.navs}">
&nbsp;[ <a href="${model.baseUri}?database=${model.database}&date=${model.date}&step=${nav.hours}&${navUrlPrefix}">${nav.title}</a> ]&nbsp;
</c:forEach> &nbsp;[ <a href="${model.baseUri}?${navUrlPrefix}">now</a> ]&nbsp;
</td>
</tr>
</table>
<table class="navbar">
<tr>
<td class="database">
<div class="database">
<c:forEach var="database" items="${model.databases}">
&nbsp;<c:choose>
<c:when test="${model.database eq database}">
<a href="${model.baseUri}?database=${database}&date=${model.date}"
class="current">[&nbsp;${database}&nbsp;]</a>
</c:when>
<c:otherwise>
<a href="${model.baseUri}?database=${database}&date=${model.date}">[&nbsp;${database}&nbsp;]</a>
</c:otherwise>
</c:choose>&nbsp;
</c:forEach>
</div>
</td>
</tr>
</table>
</br>
<table class="machines">
<tr style="text-align: left">
<th>Machines: &nbsp;[&nbsp; <c:choose>
<c:when test="${model.domain eq 'All'}">
<a href="?database=${model.database}&date=${model.date}"
class="current">All</a>
</c:when>
<c:otherwise>
<a href="?database=${model.database}&date=${model.date}">All</a>
</c:otherwise>
</c:choose> &nbsp;]&nbsp; <c:forEach var="domain" items="${model.domains}">
&nbsp;[&nbsp;
<c:choose>
<c:when test="${model.domain eq domain}">
<a href="?database=${model.database}&domain=${domain}&date=${model.date}"
class="current">${domain}</a>
</c:when>
<c:otherwise>
<a href="?database=${model.database}&domain=${domain}&date=${model.date}">${domain}</a>
</c:otherwise>
</c:choose>
&nbsp;]&nbsp;
</c:forEach>
</th>
</tr>
</table>
</br>
<table class="database">
<tr>
<th class="left"><a href="${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=name">Table</a></th>
<th>Name</th>
<th><a href="${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=total">Total</a></th>
<th><a href="${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failure">Failure</a></th>
<th><a href="${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failurePercent">Failure%</a></th>
<th><a href="${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=avg">Avg(ms)</a></th>
<th>TablePercent%</th>
<th>MethodPercent%</th>
<th>TPS</th>
</tr>
<c:forEach var="item" items="${model.displayDatabase.results}"
varStatus="status">
<tr class="odd">
<td class="left">${item.id}</td>
<td>&nbsp;</td>
<td>${w:format(item.totalCount,'#,###,###,###,##0')}</td>
<td>${w:format(item.failCount,'#,###,###,###,##0')}</td>
<td>${w:format(item.failPercent,'0.00%')}</td>
<td>${w:format(item.avg,'0.00')}</td>
<td>${w:format(item.totalPercent,'0.00%')}</td>
<td>-</td>
<td>${w:format(item.tps,'0.00')}</td>
</tr>
<c:forEach var="methodEntry" items="${item.methods}"
varStatus="status1">
<tr class="${status1.index mod 2==0 ? 'even' : 'odd'}">
<c:set var="method" value="${methodEntry.value}" />
<td style="background:white">&nbsp;</td>
<td>${method.id}</td>
<td>${w:format(method.totalCount,'#,###,###,###,##0')}</td>
<td>${w:format(method.failCount,'#,###,###,###,##0')}</td>
<td>${w:format(method.failPercent,'0.00%')}</td>
<td>${w:format(method.avg,'0.00')}</td>
<td>&nbsp;</td>
<td>${w:format(method.totalPercent,'0.00%')}</td>
<td>${w:format(method.tps,'0.00')}</td>
</tr>
</c:forEach>
<tr>
<td>&nbsp;</td>
</tr>
</c:forEach>
</table>
<table class="footer">
<tr>
<td>[ end ]</td>
</tr>
</table>
</div>
</br>
</a:body>
......@@ -4,12 +4,9 @@
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.event.Context"
scope="request" />
<jsp:useBean id="payload"
type="com.dianping.cat.report.page.event.Payload" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.event.Model"
scope="request" />
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.event.Context" scope="request" />
<jsp:useBean id="payload" type="com.dianping.cat.report.page.event.Payload" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.event.Model"scope="request" />
<c:set var="report" value="${model.report}" />
<a:report
......
......@@ -244,32 +244,32 @@ public class TestSendMessage {
t3.addData("key and value");
t3.setStatus(Message.SUCCESS);
t3.complete();
Transaction t4 = Cat.getProducer().newTransaction("Cache.memcached", "Method" + i % 10);
t4.addData("key and value");
t4.setStatus(Message.SUCCESS);
t4.complete();
Transaction t5 = Cat.getProducer().newTransaction("Cache.memcached", "Method" + i % 10);
t5.addData("key and value");
t5.setStatus(Message.SUCCESS);
t5.complete();
Transaction t6 = Cat.getProducer().newTransaction("Cache.memcached", "Method" + i % 10);
t6.addData("key and value");
t6.setStatus(Message.SUCCESS);
t6.complete();
Transaction t7 = Cat.getProducer().newTransaction("Cache.memcached", "Method" + i % 10);
t7.addData("key and value");
t7.setStatus(Message.SUCCESS);
t7.complete();
Transaction t8 = Cat.getProducer().newTransaction("Cache.memcached", "Method" + i % 10);
t8.addData("key and value");
t8.setStatus(Message.SUCCESS);
t8.complete();
Transaction t9 = Cat.getProducer().newTransaction("Cache.memcached", "Method" + i % 10);
t9.addData("key and value");
t9.setStatus(Message.SUCCESS);
......@@ -278,4 +278,69 @@ public class TestSendMessage {
}
Thread.sleep(10 * 1000);
}
@Test
public void sendSqlTransaction() throws Exception {
for (int k = 0; k < 5; k++) {
for (int i = 0; i < 100; i++) {
Transaction t = Cat.getProducer().newTransaction("SQL", "User.select" + i % 10);
Cat.getProducer().newEvent("SQL", "Select").setStatus(Message.SUCCESS);
Cat.getProducer().newEvent("SQL.database", "jdbc:mysql://192.168.7.43:3306/database" + k)
.setStatus(Message.SUCCESS);
t.addData("select * from hostinfo");
t.setStatus(Message.SUCCESS);
t.complete();
Transaction t2 = Cat.getProducer().newTransaction("SQL", "User.insert" + i % 10);
Cat.getProducer().newEvent("SQL", "Update").setStatus(Message.SUCCESS);
Cat.getProducer().newEvent("SQL.database", "jdbc:mysql://192.168.7.43:3306/database" + k)
.setStatus(Message.SUCCESS);
t2.addData("update * from hostinfo");
t2.complete();
Transaction t3 = Cat.getProducer().newTransaction("SQL", "User.delete" + i % 10);
Cat.getProducer().newEvent("SQL", "Delete").setStatus(Message.SUCCESS);
Cat.getProducer().newEvent("SQL.database", "jdbc:mysql://192.168.7.43:3306/database" + k)
.setStatus(Message.SUCCESS);
t3.addData("delete * from hostinfo");
t3.setStatus(Message.SUCCESS);
t3.complete();
}
}
Thread.sleep(1000);
}
@Test
public void sendOtherDomainSqlTransaction() throws Exception {
for (int k = 0; k < 5; k++) {
for (int i = 0; i < 100; i++) {
Transaction t = Cat.getProducer().newTransaction("SQL", "User.select" + i % 10);
Cat.getProducer().newEvent("SQL", "Select").setStatus(Message.SUCCESS);
Cat.getProducer().newEvent("SQL.database", "jdbc:mysql://192.168.7.43:3306/database" + k)
.setStatus(Message.SUCCESS);
t.addData("select * from hostinfo");
t.setStatus(Message.SUCCESS);
Cat.getManager().getThreadLocalMessageTree().setDomain("Cat" + k);
t.complete();
Transaction t2 = Cat.getProducer().newTransaction("SQL", "User.insert" + i % 10);
Cat.getProducer().newEvent("SQL", "Update").setStatus(Message.SUCCESS);
Cat.getProducer().newEvent("SQL.database", "jdbc:mysql://192.168.7.43:3306/database" + k)
.setStatus(Message.SUCCESS);
t2.addData("update * from hostinfo");
Cat.getManager().getThreadLocalMessageTree().setDomain("Cat" + k);
t2.complete();
Transaction t3 = Cat.getProducer().newTransaction("SQL", "User.delete" + i % 10);
Cat.getProducer().newEvent("SQL", "Delete").setStatus(Message.SUCCESS);
Cat.getProducer().newEvent("SQL.database", "jdbc:mysql://192.168.7.43:3306/database" + k)
.setStatus(Message.SUCCESS);
t3.addData("delete * from hostinfo");
t3.setStatus(Message.SUCCESS);
Cat.getManager().getThreadLocalMessageTree().setDomain("Cat" + k);
t3.complete();
}
}
Thread.sleep(1000);
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册