提交 06e88895 编写于 作者: Y youyong

modify the cat database report

上级 246ae2ef
......@@ -209,7 +209,7 @@ public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> im
r.setDomain(domain);
r.setPeriod(period);
r.setIp(ip);
r.setType(1);
r.setType(2);
r.setContent(xml);
m_reportDao.insert(r);
......
......@@ -12,9 +12,7 @@ import java.util.Date;
import java.util.List;
import java.util.TreeMap;
import com.dianping.cat.Cat;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.MessageStatistics;
import com.dianping.cat.message.spi.MessageStatistics;
import com.dianping.cat.status.model.entity.DiskInfo;
import com.dianping.cat.status.model.entity.DiskVolumeInfo;
import com.dianping.cat.status.model.entity.GcInfo;
......@@ -105,7 +103,6 @@ class StatusInfoCollector extends BaseVisitor {
@Override
public void visitDisk(DiskInfo disk) {
Transaction t =Cat.newTransaction("Disk", "Disk");
File[] roots = File.listRoots();
if (roots != null) {
......@@ -121,24 +118,19 @@ class StatusInfoCollector extends BaseVisitor {
}
super.visitDisk(disk);
t.complete();
}
@Override
public void visitDiskVolume(DiskVolumeInfo diskVolume) {
Transaction t =Cat.newTransaction("visitDiskVolume", "visitDiskVolume");
File volume = new File(diskVolume.getId());
diskVolume.setTotal(volume.getTotalSpace());
diskVolume.setFree(volume.getFreeSpace());
diskVolume.setUsable(volume.getUsableSpace());
t.complete();
}
@Override
public void visitMemory(MemoryInfo memory) {
Transaction t =Cat.newTransaction("visitMemory", "visitMemory");
MemoryMXBean bean = ManagementFactory.getMemoryMXBean();
Runtime runtime = Runtime.getRuntime();
......@@ -162,7 +154,6 @@ class StatusInfoCollector extends BaseVisitor {
}
super.visitMemory(memory);
t.complete();
}
@Override
......@@ -176,7 +167,6 @@ class StatusInfoCollector extends BaseVisitor {
@Override
public void visitOs(OsInfo os) {
Transaction t =Cat.newTransaction("visitOs", "visitOs");
OperatingSystemMXBean bean = ManagementFactory.getOperatingSystemMXBean();
os.setArch(bean.getArch());
......@@ -196,23 +186,18 @@ class StatusInfoCollector extends BaseVisitor {
os.setProcessTime(b.getProcessCpuTime());
os.setCommittedVirtualMemory(b.getCommittedVirtualMemorySize());
}
t.complete();
}
@Override
public void visitRuntime(RuntimeInfo runtime) {
Transaction t =Cat.newTransaction("visitRuntime", "visitRuntime");
RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
runtime.setStartTime(bean.getStartTime());
runtime.setUpTime(bean.getUptime());
t.complete();
}
@Override
public void visitStatus(StatusInfo status) {
Transaction t =Cat.newTransaction("visitStatus", "visitStatus");
status.setTimestamp(new Date());
status.setOs(new OsInfo());
status.setDisk(new DiskInfo());
......@@ -222,7 +207,6 @@ class StatusInfoCollector extends BaseVisitor {
status.setMessage(new MessageInfo());
super.visitStatus(status);
t.complete();
}
@Override
......
......@@ -87,6 +87,7 @@
<IF type='NOT_NULL' field='name'>
AND <FIELD name='name'/> = ${name}
</IF>
AND type =1
]]></statement>
</query>
<query name="find-all-by-period-domain-name" type="SELECT"
......@@ -100,6 +101,7 @@
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='domain'/> = ${domain}
AND <FIELD name='name'/> = ${name}
AND type =1
]]></statement>
</query>
<query name="find-all-by-period-domain-type-name" type="SELECT"
......@@ -115,6 +117,7 @@
AND <FIELD name='domain'/> = ${domain}
AND <FIELD name='type'/> = ${type}
AND <FIELD name='name'/> = ${name}
AND type =1
]]></statement>
</query>
<query name="find-all-by-period-type-name" type="SELECT"
......@@ -128,6 +131,7 @@
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='type'/> = ${type}
AND <FIELD name='name'/> = ${name}
AND type =1
]]></statement>
</query>
<query name="insert" type="INSERT">
......@@ -140,6 +144,70 @@
<FIELD name='creation-date'/> = NOW()
]]></statement>
</query>
<query name="find-database-all-by-domain-name-duration" type="SELECT"
multiple="true">
<param name="start-date" />
<param name="end-date" />
<param name="domain" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
<IF type='NOT_NULL' field='domain'>
AND <FIELD name='domain'/> = ${domain}
</IF>
<IF type='NOT_NULL' field='name'>
AND <FIELD name='name'/> = ${name}
</IF>
AND type=2
]]></statement>
</query>
<query name="find-database-all-by-period-domain-name" type="SELECT"
multiple="true">
<param name="period" />
<param name="domain" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='domain'/> = ${domain}
AND <FIELD name='name'/> = ${name}
AND type=2
]]></statement>
</query>
<query name="find-database-all-by-period-domain-type-name" type="SELECT"
multiple="true">
<param name="period" />
<param name="domain" />
<param name="type" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='domain'/> = ${domain}
AND <FIELD name='type'/> = ${type}
AND <FIELD name='name'/> = ${name}
AND type=2
]]></statement>
</query>
<query name="find-database-all-by-period-type-name" type="SELECT"
multiple="true">
<param name="period" />
<param name="type" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='type'/> = ${type}
AND <FIELD name='name'/> = ${name}
AND type=2
]]></statement>
</query>
</query-defs>
</entity>
......@@ -155,6 +223,10 @@
<readset name="REPORT_NAME">
<member name="report_name" />
</readset>
<readset name="REPORT_NAME_DOMAIN">
<member name="report_domain" />
<member name="report_name" />
</readset>
<readset name="COUNT">
<member name="count" />
</readset>
......@@ -343,7 +415,8 @@
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
AND <FIELD name='domain'/> = ${domain}
AND <FIELD name='name'/> = ${name}
AND <FIELD name='name'/> = ${name}
AND type = 1
]]></statement>
</query>
<query name="find-by-name-domain-period" type="SELECT">
......@@ -359,7 +432,8 @@
</IF>
<IF type='NOT_NULL' field='name'>
AND <FIELD name='name'/> = ${name}
</IF>
</IF>
AND type = 1
]]></statement>
</query>
<query name="find-all-by-period" type="SELECT" multiple="true">
......@@ -369,7 +443,8 @@
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
AND <FIELD name='period'/> < ${end-date}
AND type = 1
]]></statement>
</query>
......@@ -385,7 +460,68 @@
</IF>
<IF type='NOT_NULL' field='name'>
AND <FIELD name='name'/> = ${name}
</IF>
</IF>
AND type =1;
]]></statement>
</query><query name="find-database-all-by-domain-name-duration" type="SELECT"
multiple="true">
<param name="start-date" />
<param name="end-date" />
<param name="domain" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
AND <FIELD name='domain'/> = ${domain}
AND <FIELD name='name'/> = ${name}
AND type = 2
]]></statement>
</query>
<query name="find-database-by-name-domain-period" type="SELECT">
<param name="period" />
<param name="domain" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
<IF type='NOT_NULL' field='domain'>
AND <FIELD name='domain'/> = ${domain}
</IF>
<IF type='NOT_NULL' field='name'>
AND <FIELD name='name'/> = ${name}
</IF>
AND type = 2
]]></statement>
</query>
<query name="find-database-all-by-period" type="SELECT" multiple="true">
<param name="start-date" />
<param name="end-date" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
AND type =2
]]></statement>
</query>
<query name="delete-database-by-domain-name-period" type="DELETE">
<param name="period" />
<param name="domain" />
<param name="name" />
<statement><![CDATA[
DELETE FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
<IF type='NOT_NULL' field='domain'>
AND <FIELD name='domain'/> = ${domain}
</IF>
<IF type='NOT_NULL' field='name'>
AND <FIELD name='name'/> = ${name}
</IF>
AND type =2;
]]></statement>
</query>
......
......@@ -157,7 +157,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "event",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "event",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......@@ -202,7 +202,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "transaction",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "transaction",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......
......@@ -36,7 +36,6 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -88,7 +88,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "cross",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "cross",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......
......@@ -59,9 +59,7 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -7,14 +7,25 @@ import java.util.List;
import org.apache.commons.lang.StringUtils;
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.BaseVisitor;
public class DisplayDatabase extends BaseVisitor {
private String m_sortBy = "name";
private String m_domain = "cat";
private String m_currentDomain;
private List<Table> m_results = new ArrayList<Table>();
private int m_totalCount;
private long m_duration;
public List<Table> getResults() {
Collections.sort(m_results, new TableCompartor(m_sortBy));
return m_results;
......@@ -27,9 +38,42 @@ public class DisplayDatabase extends BaseVisitor {
return this;
}
@Override
public void visitDatabaseReport(DatabaseReport databaseReport) {
super.visitDatabaseReport(databaseReport);
for (Table table : m_results) {
int totalCount = table.getTotalCount();
table.setTotalPercent(totalCount / (double) m_totalCount);
for (Method method : table.getMethods().values()) {
method.setTotalPercent(method.getTotalCount() / (double) totalCount);
}
}
}
@Override
public void visitDomain(Domain domain) {
m_currentDomain = domain.getId();
super.visitDomain(domain);
}
@Override
public void visitTable(Table table) {
m_results.add(table);
if (m_domain.equals(m_currentDomain)) {
m_results.add(table);
if (table.getId().equals("All")) {
m_totalCount = table.getTotalCount();
table.setTotalPercent(1);
}
if (m_duration > 0) {
table.setTps(table.getTotalCount() * 1000.0 / (double) m_duration);
for (Method method : table.getMethods().values()) {
method.setTps(method.getTotalCount() * 1000.0 / (double) m_duration);
}
}
}
}
public static class TableCompartor implements Comparator<Table> {
......@@ -68,4 +112,14 @@ public class DisplayDatabase extends BaseVisitor {
}
}
public DisplayDatabase setDomain(String database) {
m_domain = database;
return this;
}
public DisplayDatabase setDuration(long duration) {
m_duration = duration;
return this;
}
}
......@@ -20,6 +20,7 @@ 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.ModelPeriod;
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;
......@@ -88,18 +89,27 @@ public class Handler implements PageHandler<Context> {
Payload payload = ctx.getPayload();
normalize(model, payload);
String domain = payload.getDomain();
switch (payload.getAction()) {
case HISTORY_REPORT:
DatabaseReport historyReport = showSummarizeReport(model, payload);
DisplayDatabase displayHistoryDatabase = new DisplayDatabase();
long historyDuration = historyReport.getEndTime().getTime() - historyReport.getStartTime().getTime();
DisplayDatabase displayHistoryDatabase = new DisplayDatabase().setDomain(domain).setDuration(
historyDuration);
displayHistoryDatabase.setSortBy(payload.getSortBy()).visitDatabaseReport(historyReport);
model.setReport(historyReport);
model.setDisplayDatabase(displayHistoryDatabase);
break;
case HOURLY_REPORT:
long hourlyDuration = ONE_HOUR;
if (ModelPeriod.CURRENT == payload.getPeriod()) {
hourlyDuration = System.currentTimeMillis() % ONE_HOUR;
}
DatabaseReport hourlyReport = getHourlyReport(payload);
DisplayDatabase displayDatabase = new DisplayDatabase();
DisplayDatabase displayDatabase = new DisplayDatabase().setDomain(domain).setDuration(hourlyDuration);
displayDatabase.setSortBy(payload.getSortBy()).visitDatabaseReport(hourlyReport);
model.setReport(hourlyReport);
......@@ -123,7 +133,7 @@ public class Handler implements PageHandler<Context> {
model.setDatabase(payload.getDatabase());
model.setDisplayDomain(payload.getDomain());
model.setDomain(payload.getDomain());
if (payload.getPeriod().isFuture()) {
model.setLongDate(payload.getCurrentDate());
} else {
......@@ -145,7 +155,7 @@ public class Handler implements PageHandler<Context> {
}
private DatabaseReport showSummarizeReport(Model model, Payload payload) {
String domain = payload.getDomain();
String database = payload.getDatabase();
DatabaseReport databaseReport = null;
Date start = payload.getHistoryStartDate();
......@@ -154,24 +164,24 @@ public class Handler implements PageHandler<Context> {
if (currentDayStart.getTime() == start.getTime()) {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "database",
List<Report> reports = m_reportDao.findDatabaseAllByDomainNameDuration(start, end, database, "database",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findDatabaseAllByDomainNameDuration(start, end, null, "database",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
Set<String> databases = new HashSet<String>();
for (Report report : allReports) {
domains.add(report.getDomain());
databases.add(report.getDomain());
}
databaseReport = m_databaseMerger.mergeForDaily(domain, reports, domains);
databaseReport = m_databaseMerger.mergeForDaily(database, reports, databases);
} catch (DalException e) {
Cat.logError(e);
}
} else {
try {
List<Dailyreport> reports = m_dailyreportDao.findAllByDomainNameDuration(start, end, domain, "database",
List<Dailyreport> reports = m_dailyreportDao.findDatabaseAllByDomainNameDuration(start, end, database, "database",
DailyreportEntity.READSET_FULL);
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(domain));
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(database));
for (Dailyreport report : reports) {
String xml = report.getContent();
DatabaseReport reportModel = DefaultSaxParser.parse(xml);
......
......@@ -37,7 +37,6 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDatabaseNames();
domainNames.add(getDatabase());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -313,7 +313,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "event",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "event",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......
......@@ -68,7 +68,6 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -124,9 +124,7 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -111,7 +111,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "matrix",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "matrix",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......
......@@ -37,9 +37,7 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -54,7 +54,7 @@ public class HistoricalCrossService extends BaseHistoricalModelService<CrossRepo
CrossReport crossReport = merger.getCrossReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
timestamp + 60 * 60 * 1000), null, "cross", ReportEntity.READSET_DOMAIN_NAME);
if (crossReport == null) {
crossReport = new CrossReport(domain);
......
......@@ -48,7 +48,7 @@ public class LocalCrossService extends BaseLocalModelService<CrossReport> {
report = new CrossReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "cross", ReportEntity.READSET_DOMAIN_NAME);
Set<String> domainNames = report.getDomainNames();
for (Report temp : historyReports) {
......
......@@ -16,7 +16,7 @@ public class DatabaseReportMerger extends DefaultMerger {
public DatabaseReportMerger(DatabaseReport databaseReport) {
super(databaseReport);
}
public Domain mergesForAllMachine(DatabaseReport report) {
Domain machine = new Domain(CatString.ALL_IP);
......@@ -40,15 +40,6 @@ public class DatabaseReportMerger extends DefaultMerger {
@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());
......@@ -58,20 +49,13 @@ public class DatabaseReportMerger extends DefaultMerger {
@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());
old.getSqlNames().addAll(method.getSqlNames());
}
@Override
......@@ -89,10 +73,13 @@ public class DatabaseReportMerger extends DefaultMerger {
m_all = old.findOrCreateDomain(CatString.ALL_Domain);
}
super.visitDatabaseReport(databaseReport);
old.setConnectUrl(databaseReport.getConnectUrl());
old.setStartTime(databaseReport.getStartTime());
old.setEndTime(databaseReport.getEndTime());
old.getDomainNames().addAll(databaseReport.getDomainNames());
old.getDatabaseNames().addAll(databaseReport.getDatabaseNames());
if(m_allDomain){
if (m_allDomain) {
old.getDomainNames().remove(CatString.ALL_Domain);
}
......
......@@ -55,7 +55,7 @@ public class HistoricalDatabaseService extends BaseHistoricalModelService<Databa
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);
timestamp + 60 * 60 * 1000), null, "database", ReportEntity.READSET_DOMAIN_NAME);
if (databaseReport == null) {
databaseReport = new DatabaseReport(database);
......
......@@ -48,7 +48,7 @@ public class LocalDatabaseService extends BaseLocalModelService<DatabaseReport>
report = new DatabaseReport(database);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "database", ReportEntity.READSET_DOMAIN_NAME);
Set<String> databaseNames = report.getDatabaseNames();
for (Report temp : historyReports) {
......
......@@ -54,7 +54,7 @@ public class HistoricalEventService extends BaseHistoricalModelService<EventRepo
EventReport eventReport = merger.getEventReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
timestamp + 60 * 60 * 1000), null, "event", ReportEntity.READSET_DOMAIN_NAME);
if (eventReport == null) {
eventReport = new EventReport(domain);
......
......@@ -48,7 +48,7 @@ public class LocalEventService extends BaseLocalModelService<EventReport> {
report = new EventReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "event", ReportEntity.READSET_DOMAIN_NAME);
Set<String> domainNames = report.getDomainNames();
for (Report temp : historyReports) {
......
......@@ -54,7 +54,7 @@ public class HistoricalHeartbeatService extends BaseHistoricalModelService<Heart
HeartbeatReport heartbeatReport = merger.getHeartbeatReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
timestamp + 60 * 60 * 1000), null, "heartbeat", ReportEntity.READSET_DOMAIN_NAME);
if (heartbeatReport == null) {
heartbeatReport = new HeartbeatReport(domain);
......
......@@ -48,7 +48,7 @@ public class LocalHeartbeatService extends BaseLocalModelService<HeartbeatReport
report = new HeartbeatReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "heartbeat", ReportEntity.READSET_DOMAIN_NAME);
Set<String> domainNames = report.getDomainNames();
for (Report temp : historyReports) {
......
......@@ -54,7 +54,7 @@ public class HistoricalMatrixService extends BaseHistoricalModelService<MatrixRe
MatrixReport matrixReport = merger.getMatrixReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
timestamp + 60 * 60 * 1000), null, "matrix", ReportEntity.READSET_DOMAIN_NAME);
if (matrixReport != null && historyReports != null) {
Set<String> domainNames = matrixReport.getDomainNames();
......
......@@ -48,7 +48,7 @@ public class LocalMatrixService extends BaseLocalModelService<MatrixReport> {
report = new MatrixReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "matrix", ReportEntity.READSET_DOMAIN_NAME);
Set<String> domainNames = report.getDomainNames();
for (Report temp : historyReports) {
......
......@@ -54,7 +54,7 @@ public class HistoricalProblemService extends BaseHistoricalModelService<Problem
ProblemReport problemReport = merger.getProblemReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
timestamp + 60 * 60 * 1000), null, "problem", ReportEntity.READSET_DOMAIN_NAME);
if (problemReport == null) {
problemReport = new ProblemReport(domain);
......
......@@ -48,7 +48,7 @@ public class LocalProblemService extends BaseLocalModelService<ProblemReport> {
report = new ProblemReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "problem", ReportEntity.READSET_DOMAIN_NAME);
Set<String> domainNames = report.getDomainNames();
for (Report temp : historyReports) {
......
......@@ -54,7 +54,7 @@ public class HistoricalTransactionService extends BaseHistoricalModelService<Tra
TransactionReport transactionReport = merger.getTransactionReport();
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(timestamp), new Date(
timestamp + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
timestamp + 60 * 60 * 1000), null, "transaction", ReportEntity.READSET_DOMAIN_NAME);
if (transactionReport == null) {
transactionReport = new TransactionReport(domain);
......
......@@ -48,7 +48,7 @@ public class LocalTransactionService extends BaseLocalModelService<TransactionRe
report = new TransactionReport(domain);
List<Report> historyReports = m_reportDao.findAllByDomainNameDuration(new Date(hour), new Date(
hour + 60 * 60 * 1000), null, null, ReportEntity.READSET_DOMAIN_NAME);
hour + 60 * 60 * 1000), null, "transaction", ReportEntity.READSET_DOMAIN_NAME);
Set<String> domainNames = report.getDomainNames();
for (Report temp : historyReports) {
......
......@@ -329,7 +329,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "problem",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "problem",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......@@ -351,7 +351,7 @@ public class Handler implements PageHandler<Context> {
ProblemReport reportModel = DefaultSaxParser.parse(xml);
reportModel.accept(merger);
}
problemReport = merger == null ? null : merger.getProblemReport();
problemReport = merger.getProblemReport();
} catch (Exception e) {
Cat.logError(e);
}
......
......@@ -91,9 +91,7 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -338,7 +338,7 @@ public class Handler implements PageHandler<Context> {
try {
List<Report> reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "transaction",
ReportEntity.READSET_FULL);
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null,
List<Report> allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, "transaction",
ReportEntity.READSET_DOMAIN_NAME);
Set<String> domains = new HashSet<String>();
......
......@@ -72,7 +72,6 @@ public class Model extends AbstractReportModel<Action, Context> {
} else {
Set<String> domainNames = m_report.getDomainNames();
domainNames.add(getDomain());
return StringSortHelper.sortDomain(domainNames);
}
}
......
......@@ -53,4 +53,21 @@ public abstract class AbstractReportBuilder {
domainSet.add(domainName.getDomain());
}
}
protected void getDatabaseSet(Set<String> domainSet, Date start, Date end) {
List<Report> databaseNames = new ArrayList<Report>();
try {
databaseNames = m_reportDao
.findAllByDomainNameDuration(start, end, null, "database", ReportEntity.READSET_DOMAIN_NAME);
} catch (DalException e) {
Cat.logError(e);
}
if (databaseNames == null || databaseNames.size() == 0) {
return;
}
for (Report domainName : databaseNames) {
domainSet.add(domainName.getDomain());
}
}
}
......@@ -44,25 +44,39 @@ public class DailyTaskProducer implements Runnable, Initializable {
@Inject
private TaskDao m_taskDao;
private boolean checkTaskGenerated(Date day) {
private boolean checkDatabaseTaskGenerated(Date day) {
List<Dailyreport> allReports = new ArrayList<Dailyreport>();
try {
allReports = m_dailyReportDao.findDatabaseAllByPeriod(day, new Date(day.getTime() + DAY),
DailyreportEntity.READSET_DOMAIN_NAME);
} catch (DalException e) {
m_logger.warn("DailyTaskProducer isYesterdayTaskGenerated", e);
}
Set<String> databaseSet = getDatabaseSet(day, new Date(day.getTime() + DAY));
int total = allReports.size();
if (total != databaseSet.size()) {
return false;
}
return true;
}
private boolean checkDomainTaskGenerated(Date day) {
List<Dailyreport> allReports = new ArrayList<Dailyreport>();
try {
allReports = m_dailyReportDao.findAllByPeriod(day, new Date(day.getTime() + DAY),
DailyreportEntity.READSET_COUNT);
DailyreportEntity.READSET_DOMAIN_NAME);
} catch (DalException e) {
m_logger.warn("DailyTaskProducer isYesterdayTaskGenerated", e);
}
Set<String> domainSet = getDomainSet(day, new Date(day.getTime() + DAY));
int total = 0;
int domanSize = domainSet.size();
int nameSize = m_dailyReportNameSet.size();
// SQL Framework
if (allReports != null && allReports.size() > 0) {
total = allReports.get(0).getCount();
}
int total = allReports.size();
if (total != domanSize * nameSize) {
return false;
......@@ -70,11 +84,38 @@ public class DailyTaskProducer implements Runnable, Initializable {
return true;
}
private boolean checkDatabaseTaskGenerated(Date day){
return false;
private void generateDatabaseTasks(Date day) {
Transaction t = Cat.newTransaction("System", "ProduceDatabaseReport");
try {
Set<String> databaseSet = getDatabaseSet(day, new Date(day.getTime() + DAY));
for (String domain : databaseSet) {
Task task = m_taskDao.createLocal();
task.setCreationDate(new Date());
task.setProducer(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
task.setReportDomain(domain);
task.setReportName("database");
task.setReportPeriod(day);
task.setStatus(1);
task.setTaskType(TYPE_DAILY);
try {
m_taskDao.insert(task);
} catch (DalException e) {
Cat.logError(e);
t.setStatus(e);
}
}
t.setStatus(Message.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
} finally {
t.complete();
}
}
private void generateDailyTasks(Date day) {
private void generateDomainDailyTasks(Date day) {
Transaction t = Cat.newTransaction("System", "ProduceDailyReport");
try {
Set<String> domainSet = getDomainSet(day, new Date(day.getTime() + DAY));
......@@ -107,6 +148,27 @@ public class DailyTaskProducer implements Runnable, Initializable {
}
}
private Set<String> getDatabaseSet(Date start, Date end) {
List<Report> databaseNames = new ArrayList<Report>();
Set<String> databaseSet = new HashSet<String>();
try {
databaseNames = m_reportDao.findDatabaseAllByDomainNameDuration(start, end, null, "database",
ReportEntity.READSET_DOMAIN_NAME);
} catch (DalException e) {
Cat.logError(e);
}
if (databaseNames == null || databaseNames.size() == 0) {
return databaseSet;
}
for (Report domainName : databaseNames) {
databaseSet.add(domainName.getDomain());
}
return databaseSet;
}
private Set<String> getDomainSet(Date start, Date end) {
List<Report> domainNames = new ArrayList<Report>();
Set<String> domainSet = new HashSet<String>();
......@@ -142,8 +204,11 @@ public class DailyTaskProducer implements Runnable, Initializable {
while (true) {
try {
Date yestoday = TaskHelper.yesterdayZero(new Date());
if (!checkTaskGenerated(yestoday)) {
generateDailyTasks(yestoday);
if (!checkDomainTaskGenerated(yestoday)) {
generateDomainDailyTasks(yestoday);
}
if (!checkDatabaseTaskGenerated(yestoday)) {
generateDatabaseTasks(yestoday);
}
Thread.sleep(10 * 60 * 1000);
} catch (Exception e) {
......
......@@ -10,5 +10,5 @@ import com.dianping.cat.hadoop.dal.Graph;
public interface GraphCreator<E> {
List<Graph> splitReportToGraphs(Date reportPeriod, String reportDomain, String reportName, E report);
public List<Graph> splitReportToGraphs(Date reportPeriod, String reportDomain, String reportName, E report);
}
......@@ -20,7 +20,7 @@ public class DatabaseMerger implements ReportMerger<DatabaseReport> {
DatabaseReport databaseReport = getDailyReport(reportDatabase, reports, false);
DatabaseReport databaseReport2 = getDailyReport(reportDatabase, reports, true);
databaseReport.addDomain(databaseReport2.findOrCreateDomain(CatString.ALL_Domain));
databaseReport.addDomain(databaseReport2.findDomain(CatString.ALL_Domain));
databaseReport.getDomainNames().add(CatString.ALL_Domain);
Date date = databaseReport.getStartTime();
......
......@@ -24,7 +24,7 @@ public class DatabaseReportBuilder extends AbstractReportBuilder implements Repo
@Override
public boolean buildDailyReport(String reportName, String reportDomain, Date reportPeriod) {
try {
Dailyreport report = getdailyReport(reportName, reportDomain, reportPeriod);
Dailyreport report = getDailyReport(reportName, reportDomain, reportPeriod);
m_dailyReportDao.insert(report);
return true;
} catch (Exception e) {
......@@ -33,13 +33,13 @@ public class DatabaseReportBuilder extends AbstractReportBuilder implements Repo
}
}
private Dailyreport getdailyReport(String reportName, String reportDatabase, Date reportPeriod) throws DalException {
private Dailyreport getDailyReport(String reportName, String reportDatabase, 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, reportDatabase, reportName,
Set<String> databaseSet = new HashSet<String>();
getDatabaseSet(databaseSet, reportPeriod, endDate);
List<Report> reports = m_reportDao.findDatabaseAllByDomainNameDuration(reportPeriod, endDate, reportDatabase, reportName,
ReportEntity.READSET_FULL);
String content = m_databaseMerger.mergeForDaily(reportDatabase, reports, domainSet).toString();
String content = m_databaseMerger.mergeForDaily(reportDatabase, reports, databaseSet).toString();
Dailyreport report = m_dailyReportDao.createLocal();
report.setContent(content);
......@@ -48,7 +48,7 @@ public class DatabaseReportBuilder extends AbstractReportBuilder implements Repo
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(reportName);
report.setPeriod(reportPeriod);
report.setType(1);
report.setType(2);
return report;
}
......@@ -60,7 +60,7 @@ public class DatabaseReportBuilder extends AbstractReportBuilder implements Repo
@Override
public boolean redoDailyReport(String reportName, String reportDomain, Date reportPeriod) {
try {
Dailyreport report = getdailyReport(reportName, reportDomain, reportPeriod);
Dailyreport report = getDailyReport(reportName, reportDomain, reportPeriod);
clearDailyReport(report);
m_dailyReportDao.insert(report);
return true;
......@@ -69,7 +69,12 @@ public class DatabaseReportBuilder extends AbstractReportBuilder implements Repo
return false;
}
}
@Override
protected void clearDailyReport(Dailyreport report) throws DalException {
this.m_dailyReportDao.deleteDatabaseByDomainNamePeriod(report);
}
@Override
public boolean redoHourReport(String reportName, String reportDomain, Date reportPeriod) {
throw new RuntimeException("Database report don't support redo HourReport!");
......
.database {
font-size: small;
min-width:50%;
}
.database tr th{
text-align:right;
......
$(document).delegate('.graph_link', 'click', function(e){
var anchor = this,
el = $(anchor),
id = Number(el.attr('data-status')) || 0;
if(e.ctrlKey || e.metaKey){
return true;
}else{
e.preventDefault();
}
var cell = document.getElementById(id);
var text = el.html();
if (text == '[:: show ::]') {
anchor.innerHTML = '[:: hide ::]';
cell.style.display = '';
cell.style.display = '';
} else {
anchor.innerHTML = '[:: show ::]';
cell.style.display = 'none';
cell.style.display = 'none';
}
});
......@@ -4,9 +4,12 @@
<%@ 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" />
<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}" />
......@@ -20,12 +23,15 @@
<div class="report">
<table class="header">
<tr>
<td class="title">&nbsp;&nbsp; From ${w:format(report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(report.endTime,'yyyy-MM-dd HH:mm:ss')}</td>
<td class="title">&nbsp;&nbsp; From
${w:format(report.startTime,'yyyy-MM-dd HH:mm:ss')} to
${w:format(report.endTime,'yyyy-MM-dd HH:mm:ss')}</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;
&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>
......@@ -38,11 +44,13 @@
<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}"
<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>
<a
href="${model.baseUri}?database=${database}&date=${model.date}">[&nbsp;${database}&nbsp;]</a>
</c:otherwise>
</c:choose>&nbsp;
</c:forEach>
......@@ -52,7 +60,7 @@
</table>
</br>
<table class="machines">
<tr style="text-align: left">
<th>Domains: &nbsp;[&nbsp; <c:choose>
......@@ -67,11 +75,13 @@
&nbsp;[&nbsp;
<c:choose>
<c:when test="${model.domain eq domain}">
<a href="?database=${model.database}&domain=${domain}&date=${model.date}"
<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>
<a
href="?database=${model.database}&domain=${domain}&date=${model.date}">${domain}</a>
</c:otherwise>
</c:choose>
&nbsp;]&nbsp;
......@@ -79,51 +89,58 @@
</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></th>
<th class="left"><a
href="?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=name">Table</a></th>
<th><a href="?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=total">Total</a></th>
<th><a href="?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failure">Failure</a></th>
<th><a href="?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failurePercent">Failure%</a></th>
<th><a href="?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=avg">Avg(ms)</a></th>
<th>Percent%</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 class="left"><a href="" class="graph_link" data-status="${status.index}">[:: show ::]</a></td>
<td class="left">${item.id}</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 id="${status.index}" style="display:none">
<td colspan="8">
<table>
<th>Method</th>
<th>Total</th>
<th>Failure</th>
<th>Failure%</th>
<th>Avg(ms)</th>
<th>Percent%</th>
<th>TPS</th>
<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>${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>${w:format(method.totalPercent,'0.00%')}</td>
<td>${w:format(method.tps,'0.00')}</td>
</tr>
</c:forEach>
</table></td>
</tr>
</c:forEach>
......@@ -135,5 +152,6 @@
</table>
</div>
</br>
<res:useJs value="${res.js.local.database_js}" target="bottom-js" />
</a:body>
......@@ -49,11 +49,11 @@
<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}"
<a href="${model.baseUri}?op=history&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>
<a href="${model.baseUri}?op=history&database=${database}&date=${model.date}">[&nbsp;${database}&nbsp;]</a>
</c:otherwise>
</c:choose>&nbsp;
</c:forEach>
......@@ -70,11 +70,11 @@
&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>11
<a href="?op=history&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>
<a href="?op=history&database=${model.database}&domain=${domain}&date=${model.date}">${domain}</a>
</c:otherwise>
</c:choose>
&nbsp;]&nbsp;
......@@ -87,46 +87,52 @@
<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></th>
<th class="left"><a href="?op=history&database=${model.database}&date=${model.date}&domain=${model.domain}&sort=name">Table</a></th>
<th><a href="?op=history&database=${model.database}&date=${model.date}&domain=${model.domain}&sort=total">Total</a></th>
<th><a href="?op=history&database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failure">Failure</a></th>
<th><a href="?op=history&database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failurePercent">Failure%</a></th>
<th><a href="?op=history&database=${model.database}&date=${model.date}&domain=${model.domain}&sort=avg">Avg(ms)</a></th>
<th>Percent%</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 class="left"><a href="" class="graph_link" data-status="${status.index}">[:: show ::]</a></td>
<td class="left">${item.id}</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 id="${status.index}" style="display:none">
<td colspan="8">
<table>
<th>Method</th>
<th>Total</th>
<th>Failure</th>
<th>Failure%</th>
<th>Avg(ms)</th>
<th>Percent%</th>
<th>TPS</th>
<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>${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>${w:format(method.totalPercent,'0.00%')}</td>
<td>${w:format(method.tps,'0.00')}</td>
</tr>
</c:forEach>
</table></td>
</tr>
</c:forEach>
......@@ -139,4 +145,5 @@
</div>
</br>
<res:useJs value="${res.js.local.database_js}" target="bottom-js" />
</a:body>
......@@ -6,6 +6,7 @@ import org.junit.runners.Suite.SuiteClasses;
import com.dianping.cat.report.graph.ValueTranslaterTest;
import com.dianping.cat.report.page.cross.CrossReportMergerTest;
import com.dianping.cat.report.page.database.DatabaseReportMergerTest;
import com.dianping.cat.report.page.event.EventGraphDataTest;
import com.dianping.cat.report.page.heartbeat.HeartbeatGraphDataTest;
import com.dianping.cat.report.page.ip.DisplayModelTest;
......@@ -68,7 +69,8 @@ EventGraphDataTest.class, HeartbeatGraphDataTest.class,
ProblemGraphDataTest.class, TransactionGraphDataTest.class,
ProblemReportMergerTest.class,
/* database test*/
DatabaseReportMergerTest.class,
/* .report.task */
TaskConsumerTest.class, TaskHelperTest.class,
......
package com.dianping.cat.report.page.database;
import org.junit.Assert;
import org.junit.Test;
import org.unidal.webres.helper.Files;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.transform.DefaultDomParser;
import com.dianping.cat.consumer.database.model.transform.DefaultXmlBuilder;
import com.dianping.cat.report.page.model.database.DatabaseReportMerger;
public class DatabaseReportMergerTest {
@Test
public void testDatabaseReportMerge() throws Exception {
String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("DatabaseReportOld.xml"), "utf-8");
String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("DatabaseReportNew.xml"), "utf-8");
DatabaseReport reportOld = new DefaultDomParser().parse(oldXml);
DatabaseReport reportNew = new DefaultDomParser().parse(newXml);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("DatabaseReportMergeResult.xml"),
"utf-8");
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(reportOld.getDatabase()));
reportOld.accept(merger);
reportNew.accept(merger);
Assert.assertEquals("Check the merge result!", expected.replaceAll("\\s*", ""), merger.getDatabaseReport().toString().replaceAll("\\s*", ""));
Assert.assertEquals("Source report is changed!", newXml.replaceAll("\\s*", ""), reportNew.toString().replaceAll("\\s*", ""));
Assert.assertEquals("Source report is changed!", oldXml.replaceAll("\\s*", ""), reportOld.toString().replaceAll("\\s*", ""));
}
@Test
public void testMergeAllIp() throws Exception {
String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("DatabaseReportOld.xml"), "utf-8");
String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("DatabaseReportNew.xml"), "utf-8");
DatabaseReport reportOld = new DefaultDomParser().parse(oldXml);
DatabaseReport reportNew = new DefaultDomParser().parse(newXml);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("DatabaseReportMergeAllResult.xml"),
"utf-8");
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(reportOld.getDatabase()));
merger.setAllDomain(true);
reportOld.accept(merger);
reportNew.accept(merger);
String actual = new DefaultXmlBuilder().buildXml(merger.getDatabaseReport());
Assert.assertEquals("Check the merge result!", expected.replaceAll("\\s*", ""), actual.replaceAll("\\s*", ""));
Assert.assertEquals("Source report is changed!", oldXml.replaceAll("\\s*", ""), reportOld.toString().replaceAll("\\s*", ""));
Assert.assertEquals("Source report is changed!", newXml.replaceAll("\\s*", ""), reportNew.toString().replaceAll("\\s*", ""));
}
}
......@@ -35,7 +35,7 @@ public class TaskConsumerTest {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
replayer.add(4);
this.stop();
......@@ -267,9 +267,8 @@ public class TaskConsumerTest {
public void run(){
try {
latch.await();
System.out.println(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
}
......@@ -307,9 +306,8 @@ public class TaskConsumerTest {
public void run(){
try {
latch.await();
System.out.println(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
}
......@@ -342,7 +340,7 @@ public class TaskConsumerTest {
}
while (!consumerTwo.isStopped()) {
Thread.sleep(10);
Thread.sleep(100);
}
Assert.assertEquals("[1, 8, 7, 10, 3, 1, 8, 4]", Arrays.toString(consumerOne.replayer.toArray()));
......
<database-report database="database0"
connect-url="jdbc:mysql://192.168.7.43:3306/database0" startTime="2012-09-06 20:00:00"
endTime="2012-09-06 20:59:59">
<databaseName>database3</databaseName>
<databaseName>database4</databaseName>
<databaseName>database1</databaseName>
<databaseName>database2</databaseName>
<databaseName>database0</databaseName>
<domainName>Cat</domainName>
<domainName>Cat0</domainName>
<domain id="All">
<table id="All" totalCount="600" failCount="600"
failPercent="1.00" avg="1.00" sum="600.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="600" failCount="600"
failPercent="1.00" avg="1.00" sum="600.00" tps="0.00" totalPercent="0.00">
</method>
</table>
<table id="Table1" totalCount="300" failCount="300"
failPercent="1.00" avg="1.00" sum="300.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="300" failCount="300"
failPercent="1.00" avg="1.00" sum="300.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table2" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table3" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
</domain></database-report>
\ No newline at end of file
<database-report database="database0"
connect-url="jdbc:mysql://192.168.7.43:3306/database0" startTime="2012-09-06 20:00:00"
endTime="2012-09-06 20:59:59">
<databaseName>database3</databaseName>
<databaseName>database4</databaseName>
<databaseName>database1</databaseName>
<databaseName>database2</databaseName>
<databaseName>database0</databaseName>
<domainName>Cat</domainName>
<domainName>Cat0</domainName>
<domain id="Cat">
<table id="All" totalCount="400" failCount="400"
failPercent="1.00" avg="1.00" sum="400.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="400" failCount="400"
failPercent="1.00" avg="1.00" sum="400.00" tps="0.00" totalPercent="0.00">
</method>
</table>
<table id="Table1" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table2" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table3" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
</domain>
<domain id="Cat1">
<table id="All" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="0.00">
</method>
</table>
<table id="Table1" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table2" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
</domain></database-report>
\ No newline at end of file
<database-report database="database0"
connect-url="jdbc:mysql://192.168.7.43:3306/database0" startTime="2012-09-06 20:00:00"
endTime="2012-09-06 20:59:59">
<databaseName>database3</databaseName>
<databaseName>database4</databaseName>
<databaseName>database1</databaseName>
<databaseName>database2</databaseName>
<databaseName>database0</databaseName>
<domainName>Cat</domainName>
<domainName>Cat0</domainName>
<domain id="Cat">
<table id="All" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="1.00">
<method id="Update" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="1.00">
</method>
</table>
<table id="Table1" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.50">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="1.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table3" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.50">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="1.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
</domain>
<domain id="Cat1">
<table id="All" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="1.00">
<method id="Update" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="1.00">
</method>
</table>
<table id="Table1" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.50">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="1.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table2" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.50">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="1.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
</domain></database-report>
\ No newline at end of file
<database-report database="database0"
connect-url="jdbc:mysql://192.168.7.43:3306/database0" startTime="2012-09-06 20:00:00"
endTime="2012-09-06 20:59:59">
<databaseName>database3</databaseName>
<databaseName>database4</databaseName>
<databaseName>database1</databaseName>
<databaseName>database2</databaseName>
<databaseName>database0</databaseName>
<domainName>Cat</domainName>
<domainName>Cat0</domainName>
<domain id="Cat">
<table id="All" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="1.00">
<method id="Update" totalCount="200" failCount="200"
failPercent="1.00" avg="1.00" sum="200.00" tps="0.00" totalPercent="1.00">
</method>
</table>
<table id="Table1" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.50">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="1.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
<table id="Table2" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="0.50">
<method id="Update" totalCount="100" failCount="100"
failPercent="1.00" avg="1.00" sum="100.00" tps="0.00" totalPercent="1.00">
<sql>User.insert0</sql>
<sql>User.insert1</sql>
</method>
</table>
</domain></database-report>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册