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

modify the dao and service

上级 1b4331d2
......@@ -15,6 +15,7 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.hsqldb.lib.StringUtil;
import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.helper.Files;
......@@ -129,7 +130,9 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
Map<String, ProductLine> productLines = new TreeMap<String, ProductLine>();
for (ProductLine line : getCompany().getProductLines().values()) {
productLines.put(line.getId(), line);
if (!StringUtil.isEmpty(line.getId())) {
productLines.put(line.getId(), line);
}
}
return sortMap(productLines, new Comparator<Map.Entry<String, ProductLine>>() {
......
......@@ -31,6 +31,7 @@ public class StateDelegate implements ReportDelegate<StateReport> {
@Override
public boolean createHourlyTask(StateReport report) {
m_taskManager.createTask(report.getStartTime(), report.getDomain(), "bug", TaskProlicy.ALL_EXCLUED_HOURLY);
return m_taskManager.createTask(report.getStartTime(), report.getDomain(), StateAnalyzer.ID, TaskProlicy.ALL_EXCLUED_HOURLY);
}
......
......@@ -32,6 +32,7 @@ import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.state.StateGraphs;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.system.config.BugConfigManager;
import com.dianping.cat.system.config.ConfigReloadTask;
import com.dianping.cat.system.config.ExceptionThresholdConfigManager;
......@@ -63,6 +64,8 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(TopologyGraphConfigManager.class).req(ConfigDao.class));
all.add(C(ExceptionThresholdConfigManager.class).req(ConfigDao.class));
all.add(C(BugConfigManager.class).req(ConfigDao.class));
all.add(C(TopologyGraphItemBuilder.class).req(TopologyGraphConfigManager.class));
......
......@@ -23,6 +23,7 @@ import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.report.task.DefaultTaskConsumer;
import com.dianping.cat.report.task.bug.BugReportBuilder;
import com.dianping.cat.report.task.cross.CrossReportBuilder;
import com.dianping.cat.report.task.dependency.DependencyReportBuilder;
import com.dianping.cat.report.task.event.EventGraphCreator;
......@@ -93,6 +94,9 @@ public class TaskComponentConfigurator extends AbstractResourceConfigurator {
.req(GraphDao.class, ReportService.class) //
.req(HeartbeatGraphCreator.class));
all.add(C(BugReportBuilder.class)
.req( ReportService.class));
all.add(C(MatrixReportBuilder.class).req(ReportService.class));
all.add(C(SqlReportBuilder.class).req(ReportService.class, SqlMerger.class));
......@@ -107,11 +111,9 @@ public class TaskComponentConfigurator extends AbstractResourceConfigurator {
TopologyGraphDao.class));
all.add(C(ReportFacade.class)//
.req(TransactionReportBuilder.class, EventReportBuilder.class,
ProblemReportBuilder.class //
, HeartbeatReportBuilder.class, MatrixReportBuilder.class,
CrossReportBuilder.class //
, SqlReportBuilder.class, StateReportBuilder.class, DependencyReportBuilder.class,
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class //
, HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class //
, SqlReportBuilder.class, StateReportBuilder.class, DependencyReportBuilder.class,BugReportBuilder.class,
MetricBaselineReportBuilder.class));
return all;
......
......@@ -41,7 +41,9 @@ com.dianping.cat.report.page.jsError.Handler.class,
com.dianping.cat.report.page.dependency.Handler.class,
com.dianping.cat.report.page.externalError.Handler.class
com.dianping.cat.report.page.externalError.Handler.class,
com.dianping.cat.report.page.bug.Handler.class
})
public class ReportModule extends AbstractModule {
......
......@@ -39,7 +39,9 @@ public enum ReportPage implements Page {
DEPENDENCY("dependency", "dependency", "Dependency", "Dependency", true),
EXTERNALERROR("externalError", "externalError", "externalError", "ExternalError", true);
EXTERNALERROR("externalError", "externalError", "externalError", "ExternalError", true),
BUG("bug", "bug", "Bug", "Bug", true);
private String m_name;
......
package com.dianping.cat.report.page.bug;
public enum Action implements org.unidal.web.mvc.Action {
HISTORY_REPORT("history"),
HOURLY_REPORT("view");
private String m_name;
private Action(String name) {
m_name = name;
}
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
if (action.getName().equals(name)) {
return action;
}
}
return defaultAction;
}
@Override
public String getName() {
return m_name;
}
}
package com.dianping.cat.report.page.bug;
import com.dianping.cat.report.ReportContext;
public class Context extends ReportContext<Payload> {
}
package com.dianping.cat.report.page.bug;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.service.ReportService;
import org.unidal.lookup.annotation.Inject;
import org.unidal.web.mvc.PageHandler;
import org.unidal.web.mvc.annotation.InboundActionMeta;
import org.unidal.web.mvc.annotation.OutboundActionMeta;
import org.unidal.web.mvc.annotation.PayloadMeta;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject
private ReportService m_reportService;
@Inject
private ProductLineConfigManager m_configManager;
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "bug")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "bug")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
model.setPage(ReportPage.BUG);
m_jspViewer.view(ctx, model);
}
private BugReport queryBugReport(Payload payload) {
Date start = null;
Date end = null;
if (payload.getAction() == Action.HOURLY_REPORT) {
start = new Date(payload.getDate());
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
} else {
start = payload.getHistoryStartDate();
end = payload.getHistoryEndDate();
}
return m_reportService.queryBugReport(CatString.CAT, start, end);
}
}
package com.dianping.cat.report.page.bug;
public enum JspFile {
HOURLY_REPORT("/jsp/report/bug/bug.jsp"),
HISTORY_REPORT("/jsp/report/bug/bugHistory.jsp"),
;
private String m_path;
private JspFile(String path) {
m_path = path;
}
public String getPath() {
return m_path;
}
}
package com.dianping.cat.report.page.bug;
import com.dianping.cat.report.ReportPage;
import org.unidal.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_REPORT.getPath();
case HISTORY_REPORT:
return JspFile.HISTORY_REPORT.getPath();
}
throw new RuntimeException("Unknown action: " + action);
}
}
package com.dianping.cat.report.page.bug;
import java.util.ArrayList;
import java.util.Collection;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.report.page.AbstractReportModel;
public class Model extends AbstractReportModel<Action, Context> {
public Model(Context ctx) {
super(ctx);
}
@Override
public Action getDefaultAction() {
return Action.HOURLY_REPORT;
}
@Override
public String getDomain() {
return CatString.CAT;
}
@Override
public Collection<String> getDomains() {
return new ArrayList<String>();
}
}
package com.dianping.cat.report.page.bug;
import org.unidal.web.mvc.ActionContext;
import org.unidal.web.mvc.payload.annotation.FieldMeta;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.AbstractReportPayload;
public class Payload extends AbstractReportPayload<Action> {
private ReportPage m_page;
@FieldMeta("op")
private Action m_action;
public Payload() {
super(ReportPage.BUG);
}
@Override
public Action getAction() {
return m_action;
}
@Override
public ReportPage getPage() {
return m_page;
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.HOURLY_REPORT);
}
@Override
public void setPage(String page) {
m_page = ReportPage.getByName(page, ReportPage.BUG);
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.HOURLY_REPORT;
}
}
}
......@@ -11,6 +11,7 @@ import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface DailyReportService {
......@@ -31,4 +32,6 @@ public interface DailyReportService {
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
public boolean insert(DailyReport report);
public BugReport queryBugReport(String domain, Date start, Date end);
}
......@@ -14,6 +14,8 @@ import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface HourlyReportService {
public Set<String> queryAllDomainNames(Date start, Date end, String reportName);
......@@ -39,4 +41,8 @@ public interface HourlyReportService {
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
public DependencyReport queryDependencyReport(String domain, Date start, Date end);
public BugReport queryBugReport(String domain, Date start, Date end);
public boolean insert(HourlyReport report);
}
......@@ -24,6 +24,7 @@ import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.message.Transaction;
public class MonthlyReportCache implements Initializable {
......@@ -158,4 +159,9 @@ public class MonthlyReportCache implements Initializable {
}
}
public BugReport queryBugReport(String domain, Date start) {
// TODO Auto-generated method stub
return null;
}
}
......@@ -11,6 +11,7 @@ import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface MonthlyReportService {
......@@ -31,4 +32,6 @@ public interface MonthlyReportService {
public TransactionReport queryTransactionReport(String domain, Date start);
public boolean insert(MonthlyReport report);
public BugReport queryBugReport(String domain, Date start);
}
......@@ -15,8 +15,10 @@ import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface ReportService {
......@@ -44,6 +46,10 @@ public interface ReportService {
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
public BugReport queryBugReport(String domain, Date start, Date end);
public boolean insertHourlyReport(HourlyReport report);
public boolean insertDailyReport(DailyReport report);
public boolean insertWeeklyReport(WeeklyReport report);
......
......@@ -24,6 +24,7 @@ import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.message.Transaction;
public class WeeklyReportCache implements Initializable {
......@@ -157,4 +158,9 @@ public class WeeklyReportCache implements Initializable {
}
public BugReport queryBugReport(String domain, Date start) {
// TODO Auto-generated method stub
return null;
}
}
......@@ -11,6 +11,7 @@ import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface WeeklyReportService {
......@@ -31,4 +32,6 @@ public interface WeeklyReportService {
public TransactionReport queryTransactionReport(String domain, Date start);
public boolean insert(WeeklyReport report);
public BugReport queryBugReport(String domain, Date start);
}
......@@ -26,7 +26,9 @@ import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.DailyReportDao;
import com.dianping.cat.core.dal.DailyReportEntity;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.report.service.DailyReportService;
import com.dianping.cat.report.task.bug.BugReportMerger;
public class DailyReportServiceImpl implements DailyReportService {
......@@ -240,6 +242,33 @@ public class DailyReportServiceImpl implements DailyReportService {
transactionReport.setEndTime(end);
return transactionReport;
}
@Override
public BugReport queryBugReport(String domain, Date start, Date end) {
BugReportMerger merger = new BugReportMerger(new BugReport(domain));
long startTime = start.getTime();
long endTime = end.getTime();
String name = "bug";
for (; startTime < endTime; startTime = startTime + TimeUtil.ONE_DAY) {
try {
DailyReport report = m_dailyReportDao.findByDomainNamePeriod(domain, name, new Date(startTime),
DailyReportEntity.READSET_FULL);
String xml = report.getContent();
BugReport reportModel = com.dianping.cat.home.bug.transform.DefaultSaxParser
.parse(xml);
reportModel.accept(merger);
} catch (Exception e) {
Cat.logError(e);
}
}
BugReport bugReport = merger.getBugReport();
bugReport.setStartTime(start);
bugReport.setEndTime(end);
return bugReport;
}
@Override
public boolean insert(DailyReport report) {
......
......@@ -38,9 +38,11 @@ import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.HourlyReportDao;
import com.dianping.cat.core.dal.HourlyReportEntity;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.message.Event;
import com.dianping.cat.report.page.model.metric.MetricReportMerger;
import com.dianping.cat.report.service.HourlyReportService;
import com.dianping.cat.report.task.bug.BugReportMerger;
public class HourlyReportServiceImpl implements HourlyReportService {
......@@ -503,5 +505,56 @@ public class HourlyReportServiceImpl implements HourlyReportService {
transactionReport.getDomainNames().addAll(domains);
return transactionReport;
}
@Override
public BugReport queryBugReport(String domain, Date start, Date end) {
BugReportMerger merger = new BugReportMerger(new BugReport(domain));
long startTime = start.getTime();
long endTime = end.getTime();
String name = "bug";
for (; startTime < endTime; startTime = startTime + TimeUtil.ONE_HOUR) {
List<HourlyReport> reports = null;
try {
reports = m_reportDao.findAllByDomainNamePeriod(new Date(startTime), domain, name,
HourlyReportEntity.READSET_FULL);
} catch (DalException e) {
Cat.logError(e);
}
if (reports != null) {
for (HourlyReport report : reports) {
String xml = report.getContent();
try {
BugReport reportModel = com.dianping.cat.home.bug.transform.DefaultSaxParser
.parse(xml);
reportModel.accept(merger);
} catch (Exception e) {
Cat.logError(e);
Cat.getProducer().logEvent("ErrorXML", name, Event.SUCCESS,
report.getDomain() + " " + report.getPeriod() + " " + report.getId());
}
}
}
}
BugReport bugReport = merger.getBugReport();
bugReport.setStartTime(start);
bugReport.setEndTime(new Date(end.getTime() - 1));
return bugReport;
}
@Override
public boolean insert(HourlyReport report) {
try {
m_reportDao.insert(report);
return true;
} catch (DalException e) {
Cat.logError(e);
return false;
}
}
}
......@@ -17,6 +17,7 @@ import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.MonthlyReportDao;
import com.dianping.cat.core.dal.MonthlyReportEntity;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.report.service.MonthlyReportService;
public class MonthlyReportServiceImpl implements MonthlyReportService {
......@@ -135,6 +136,20 @@ public class MonthlyReportServiceImpl implements MonthlyReportService {
}
return new TransactionReport(domain);
}
@Override
public BugReport queryBugReport(String domain, Date start) {
try {
MonthlyReport entity = m_monthlyReportDao.findReportByDomainNamePeriod(start, domain, "bug",
MonthlyReportEntity.READSET_FULL);
String content = entity.getContent();
return com.dianping.cat.home.bug.transform.DefaultSaxParser.parse(content);
} catch (Exception e) {
Cat.logError(e);
}
return new BugReport(domain);
}
@Override
public boolean insert(MonthlyReport report) {
......
......@@ -18,9 +18,11 @@ import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.report.service.DailyReportService;
import com.dianping.cat.report.service.HourlyReportService;
import com.dianping.cat.report.service.MonthlyReportCache;
......@@ -374,6 +376,35 @@ public class ReportServiceImpl implements ReportService {
}
return report;
}
@Override
public BugReport queryBugReport(String domain, Date start, Date end) {
int type = getQueryType(start, end);
BugReport report = null;
if (type == s_hourly) {
report = m_hourlyReportService.queryBugReport(domain, start, end);
} else if (type == s_daily) {
report = m_dailyReportService.queryBugReport(domain, start, end);
} else if (type == s_historyDaily) {
report = m_dailyReportService.queryBugReport(domain, start, end);
} else if (type == s_historyWeekly) {
report = m_weeklyReportService.queryBugReport(domain, start);
} else if (type == s_currentWeekly) {
report = m_weeklyReportCache.queryBugReport(domain, start);
} else if (type == s_historyMonth) {
report = m_monthlyReportService.queryBugReport(domain, start);
} else if (type == s_currentMonth) {
report = m_monthReportCache.queryBugReport(domain, start);
} else {
report = m_dailyReportService.queryBugReport(domain, start, end);
}
if (report == null) {
report = new BugReport(domain);
report.setStartTime(start).setEndTime(end);
}
return report;
}
@Override
public boolean insertDailyReport(DailyReport report) {
......@@ -390,4 +421,9 @@ public class ReportServiceImpl implements ReportService {
return m_monthlyReportService.insert(report);
}
@Override
public boolean insertHourlyReport(HourlyReport report) {
return m_hourlyReportService.insert(report);
}
}
......@@ -17,6 +17,7 @@ import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.core.dal.WeeklyReportDao;
import com.dianping.cat.core.dal.WeeklyReportEntity;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.report.service.WeeklyReportService;
public class WeeklyReportServiceImpl implements WeeklyReportService {
......@@ -135,6 +136,20 @@ public class WeeklyReportServiceImpl implements WeeklyReportService {
}
return new TransactionReport(domain);
}
@Override
public BugReport queryBugReport(String domain, Date start) {
try {
WeeklyReport entity = m_weeklyReportDao.findReportByDomainNamePeriod(start, domain, "bug",
WeeklyReportEntity.READSET_FULL);
String content = entity.getContent();
return com.dianping.cat.home.bug.transform.DefaultSaxParser.parse(content);
} catch (Exception e) {
Cat.logError(e);
}
return new BugReport(domain);
}
@Override
public boolean insert(WeeklyReport report) {
......
package com.dianping.cat.report.task.bug;
import java.util.Date;
import java.util.Set;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportTaskBuilder;
public class BugReportBuilder implements ReportTaskBuilder {
@Inject
protected ReportService m_reportService;
@Override
public boolean buildDailyTask(String name, String domain, Date period) {
BugReport bugReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period));
DailyReport report = new DailyReport();
report.setContent(bugReport.toString());
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(period);
report.setType(1);
return m_reportService.insertDailyReport(report);
}
@Override
public boolean buildHourlyTask(String name, String domain, Date start) {
BugReport bugReport = new BugReport(CatString.CAT);
ProblemReportVisitor visitor = new ProblemReportVisitor().setReport(bugReport);
Date end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
Set<String> domains = m_reportService.queryAllDomainNames(start, end, "problem");
for (String domainName : domains) {
ProblemReport problemReport = m_reportService.queryProblemReport(domainName, start, end);
visitor.visitProblemReport(problemReport);
}
HourlyReport report = new HourlyReport();
report.setContent(bugReport.toString());
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(start);
report.setType(1);
return m_reportService.insertHourlyReport(report);
}
@Override
public boolean buildMonthlyTask(String name, String domain, Date period) {
BugReport bugReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period));
MonthlyReport report = new MonthlyReport();
report.setContent(bugReport.toString());
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(period);
report.setType(1);
return m_reportService.insertMonthlyReport(report);
}
@Override
public boolean buildWeeklyTask(String name, String domain, Date period) {
BugReport bugReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeUtil.ONE_WEEK));
WeeklyReport report = new WeeklyReport();
String content = bugReport.toString();
report.setContent(content);
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(period);
report.setType(1);
return m_reportService.insertWeeklyReport(report);
}
private BugReport queryDailyReportsByDuration(String domain, Date start, Date end) {
long startTime = start.getTime();
long endTime = end.getTime();
BugReportMerger merger = new BugReportMerger(new BugReport(domain));
for (; startTime < endTime; startTime += TimeUtil.ONE_DAY) {
try {
BugReport reportModel = m_reportService.queryBugReport(domain, new Date(startTime), new Date(startTime
+ TimeUtil.ONE_DAY));
reportModel.accept(merger);
} catch (Exception e) {
Cat.logError(e);
}
}
BugReport bugReport = merger.getBugReport();
bugReport.setStartTime(start);
bugReport.setEndTime(end);
return bugReport;
}
private BugReport queryHourlyReportsByDuration(String name, String domain, Date period, Date endDate) {
long startTime = period.getTime();
long endTime = endDate.getTime();
BugReportMerger merger = new BugReportMerger(new BugReport(domain));
for (; startTime < endTime; startTime = startTime + TimeUtil.ONE_HOUR) {
Date date = new Date(startTime);
BugReport reportModel = m_reportService.queryBugReport(domain, date, new Date(date.getTime()
+ TimeUtil.ONE_HOUR));
reportModel.accept(merger);
}
com.dianping.cat.home.bug.entity.BugReport bugReport = merger.getBugReport();
return bugReport;
}
}
package com.dianping.cat.report.task.bug;
import java.util.List;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.bug.entity.Domain;
import com.dianping.cat.home.bug.entity.ExceptionItem;
import com.dianping.cat.home.bug.transform.DefaultMerger;
public class BugReportMerger extends DefaultMerger {
public BugReportMerger(BugReport bugReport) {
super(bugReport);
}
@Override
protected void mergeBugReport(BugReport old, BugReport bugReport) {
old.setStartTime(bugReport.getStartTime());
old.setEndTime(bugReport.getEndTime());
old.setDomain(bugReport.getDomain());
super.mergeBugReport(old, bugReport);
}
@Override
protected void mergeDomain(Domain old, Domain domain) {
super.mergeDomain(old, domain);
}
@Override
protected void mergeExceptionItem(ExceptionItem old, ExceptionItem exceptionItem) {
old.setCount(old.getCount() + exceptionItem.getCount());
old.getMessages().addAll(exceptionItem.getMessages());
List<String> oldMessages = old.getMessages();
if (oldMessages.size() > 10) {
oldMessages = oldMessages.subList(0, 10);
}
}
}
package com.dianping.cat.report.task.bug;
import java.util.List;
import com.dianping.cat.consumer.problem.ProblemType;
import com.dianping.cat.consumer.problem.model.entity.Duration;
import com.dianping.cat.consumer.problem.model.entity.Entry;
import com.dianping.cat.consumer.problem.model.entity.Machine;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.entity.Segment;
import com.dianping.cat.consumer.problem.model.transform.BaseVisitor;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.bug.entity.Domain;
import com.dianping.cat.home.bug.entity.ExceptionItem;
public class ProblemReportVisitor extends BaseVisitor {
private BugReport m_report;
private String m_currentDomain;
private String m_exception;
@Override
public void visitDuration(Duration duration) {
int count = duration.getCount();
List<String> messages = duration.getMessages();
Domain domainInfo = m_report.findOrCreateDomain(m_currentDomain);
ExceptionItem target = domainInfo.findOrCreateExceptionItem(m_exception);
List<String> oldMessages = target.getMessages();
target.setCount(target.getCount() + count);
oldMessages.addAll(messages);
if (oldMessages.size() > 10) {
oldMessages = oldMessages.subList(0, 10);
}
}
@Override
public void visitEntry(Entry entry) {
String type = entry.getType();
if (ProblemType.ERROR.equals(type)) {
m_exception = entry.getStatus();
super.visitEntry(entry);
}
}
@Override
public void visitMachine(Machine machine) {
super.visitMachine(machine);
}
@Override
public void visitProblemReport(ProblemReport problemReport) {
m_currentDomain = problemReport.getDomain();
super.visitProblemReport(problemReport);
}
@Override
public void visitSegment(Segment segment) {
super.visitSegment(segment);
}
public BugReport getReport() {
return m_report;
}
public ProblemReportVisitor setReport(BugReport report) {
m_report = report;
return this;
}
}
......@@ -13,6 +13,7 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.ReportType;
import com.dianping.cat.core.dal.Task;
import com.dianping.cat.report.task.bug.BugReportBuilder;
import com.dianping.cat.report.task.cross.CrossReportBuilder;
import com.dianping.cat.report.task.dependency.DependencyReportBuilder;
import com.dianping.cat.report.task.event.EventReportBuilder;
......@@ -57,6 +58,9 @@ public class ReportFacade implements LogEnabled, Initializable {
@Inject
private StateReportBuilder m_stateReportBuilder;
@Inject
private BugReportBuilder m_bugReportBuilder;
@Inject
private DependencyReportBuilder m_dependendcyReportBuilder;
......@@ -133,6 +137,7 @@ public class ReportFacade implements LogEnabled, Initializable {
m_reportBuilders.put("state", m_stateReportBuilder);
m_reportBuilders.put("dependency", m_dependendcyReportBuilder);
m_reportBuilders.put("metric", m_metricBaselineReportBuilder);
m_reportBuilders.put("bug", m_bugReportBuilder);
}
}
package com.dianping.cat.system.config;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.helper.Files;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.core.config.Config;
import com.dianping.cat.core.config.ConfigDao;
import com.dianping.cat.core.config.ConfigEntity;
import com.dianping.cat.home.bug.config.entity.BugConfig;
import com.dianping.cat.home.bug.config.entity.Domain;
import com.dianping.cat.home.bug.config.transform.DefaultSaxParser;
public class BugConfigManager implements Initializable, LogEnabled {
@Inject
private ConfigDao m_configDao;
private int m_configId;
private BugConfig m_bugConfig;
private Logger m_logger;
private static final String CONFIG_NAME = "bugConfig";
public List<String> queryBugConfigsByDomain(String domain) {
Domain config = m_bugConfig.findDomain(domain);
if (config == null) {
return m_bugConfig.getExceptions();
} else {
if (config.getAdditivity() == true) {
List<String> result = new ArrayList<String>();
result.addAll(m_bugConfig.getExceptions());
result.addAll(config.getExceptions());
return result;
} else {
return config.getExceptions();
}
}
}
public BugConfig getBugConfig() {
return m_bugConfig;
}
public boolean insert(String xml) {
try {
m_bugConfig = DefaultSaxParser.parse(xml);
return storeConfig();
} catch (Exception e) {
Cat.logError(e);
m_logger.error(e.getMessage(), e);
return false;
}
}
@Override
public void initialize() throws InitializationException {
try {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
String content = config.getContent();
m_bugConfig = DefaultSaxParser.parse(content);
m_configId = config.getId();
} catch (DalNotFoundException e) {
try {
String content = Files.forIO().readFrom(
this.getClass().getResourceAsStream("/config/default-bug-config.xml"), "utf-8");
Config config = m_configDao.createLocal();
config.setName(CONFIG_NAME);
config.setContent(content);
m_configDao.insert(config);
m_bugConfig = DefaultSaxParser.parse(content);
m_configId = config.getId();
} catch (Exception ex) {
Cat.logError(ex);
}
} catch (Exception e) {
Cat.logError(e);
}
if (m_bugConfig == null) {
m_bugConfig = new BugConfig();
}
}
private boolean storeConfig() {
synchronized (this) {
try {
Config config = m_configDao.createLocal();
config.setId(m_configId);
config.setKeyId(m_configId);
config.setName(CONFIG_NAME);
config.setContent(m_bugConfig.toString());
m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
} catch (Exception e) {
Cat.logError(e);
return false;
}
}
return true;
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
}
\ No newline at end of file
......@@ -54,6 +54,8 @@ public enum Action implements org.unidal.web.mvc.Action {
EXCEPTION_THRESHOLD_UPDATE_SUBMIT("exceptionThresholdUpdateSubmit"),
EXCEPTION_THRESHOLD_DELETE("exceptionThresholdDelete"),
BUG_CONFIG_UPDATE("bugConfigUpdate"),
;
private String m_name;
......
......@@ -38,6 +38,7 @@ import com.dianping.cat.home.dependency.exception.entity.ExceptionLimit;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.system.SystemPage;
import com.dianping.cat.system.config.BugConfigManager;
import com.dianping.cat.system.config.ExceptionThresholdConfigManager;
public class Handler implements PageHandler<Context> {
......@@ -61,6 +62,9 @@ public class Handler implements PageHandler<Context> {
@Inject
private ExceptionThresholdConfigManager m_exceptionConfigManager;
@Inject
private BugConfigManager m_bugConfigManager;
@Inject
private DomainNavManager m_manager;
......@@ -266,6 +270,15 @@ public class Handler implements PageHandler<Context> {
updateExceptionLimit(payload);
model.setExceptionLimits(m_exceptionConfigManager.queryAllExceptionLimits());
break;
case BUG_CONFIG_UPDATE:
String xml = payload.getBug();
if(!StringUtils.isEmpty(xml)){
model.setOpState(m_bugConfigManager.insert(payload.getBug()));
}else{
model.setOpState(true);
}
model.setBug(m_bugConfigManager.getBugConfig().toString());
break;
}
m_jspViewer.view(ctx, model);
}
......@@ -368,5 +381,5 @@ public class Handler implements PageHandler<Context> {
}
}
}
}
......@@ -29,7 +29,9 @@ public enum JspFile {
EXCEPTION_THRESHOLD("/jsp/system/exception/exceptionThreshold.jsp"),
EXCEPTION_THRESHOLD_CONFIG("/jsp/system/exception/exceptionThresholdConfig.jsp")
EXCEPTION_THRESHOLD_CONFIG("/jsp/system/exception/exceptionThresholdConfig.jsp"),
BUG_CONFIG_UPDATE("/jsp/system/bug/bugConfig.jsp"),
;
private String m_path;
......
......@@ -69,6 +69,9 @@ public class JspViewer extends BaseJspViewer<SystemPage, Action, Context, Model>
return JspFile.EXCEPTION_THRESHOLD.getPath();
case EXCEPTION_THRESHOLD_UPDATE:
return JspFile.EXCEPTION_THRESHOLD_CONFIG.getPath();
//Bug
case BUG_CONFIG_UPDATE:
return JspFile.BUG_CONFIG_UPDATE.getPath();
}
throw new RuntimeException("Unknown action: " + action);
......
......@@ -51,6 +51,8 @@ public class Model extends ViewModel<SystemPage, Action, Context> {
private MetricItemConfig m_metricItemConfig;
private Map<ProductLine, List<MetricItemConfig>> m_productMetricConfigs;
private String m_bug;
public Model(Context ctx) {
super(ctx);
......@@ -217,6 +219,14 @@ public class Model extends ViewModel<SystemPage, Action, Context> {
m_exceptionLimits = exceptionLimits;
}
public String getBug() {
return m_bug;
}
public void setBug(String bug) {
m_bug = bug;
}
public static class Edge {
private List<EdgeConfig> m_edgeConfigs;
......
......@@ -74,6 +74,9 @@ public class Payload implements ActionPayload<SystemPage, Action> {
@FieldMeta("exception")
private String m_exception;
@FieldMeta("bug")
private String m_bug;
@Override
public Action getAction() {
if (m_action == null) {
......@@ -260,4 +263,12 @@ public class Payload implements ActionPayload<SystemPage, Action> {
m_exceptionLimit = exceptionLimit;
}
public String getBug() {
return m_bug;
}
public void setBug(String bug) {
m_bug = bug;
}
}
......@@ -2,21 +2,19 @@
<model>
<entity name="bug-report" root="true">
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="domain" value-type="String" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<entity-ref name="domain" type="list" names="domains" />
</entity>
<entity name="domain">
<attribute name="id" value-type="String" />
<element name="excpetion" value-type="String" />
<entity-ref name="exception" />
<element name="problem-url" value-type="String" />
<entity-ref name="exception-item" type="list" names="exception-items" />
</entity>
<entity name="exception">
<entity name="exception-item">
<attribute name="id" value-type="String" />
<attribute name="count" value-type="int" />
<entity-ref name="message" type="list" names="messages" />
</entity>
<entity name="message">
<attribute name="id" value-type="String" />
<element name="message" value-type="String" type="list" names="messages" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="bug-config" root="true">
<entity-ref name="exception" type="list" names="exceptions" />
<entity-ref name="domain" />
</entity>
<entity name="exception">
<attribute name="id" value-type="String" />
<element name="exception" value-type="String" type="list" names="exceptions" />
<entity-ref name="domain" type="list" names="domains" />
</entity>
<entity name="domain">
<attribute name="id" value-type="String" />
<attribute name="additivity" value-type="boolean" />
<entity-ref name="exception" type="list" names="exceptions" />
<element name="exception" value-type="String" type="list" names="exceptions" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.home.bug.config" enable-merger="true" enable-sax-parser="true"
enable-base-visitor="true" >
<model model-package="com.dianping.cat.home.bug.config" enable-merger="true" enable-sax-parser="true"
enable-base-visitor="true" enable-xml-parser="false" enable-xml-builder="false" >
<entity name="bug-config" root="true">
<element name="exception" value-type="String" type="list" names="exceptions" />
<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"/>
<attribute name="additivity" value-type="boolean" />
<element name="exception" value-type="String" type="list" names="exceptions" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.home.bug" enable-merger="true" enable-sax-parser="true"
enable-base-visitor="true" >
<model model-package="com.dianping.cat.home.bug" enable-merger="true" enable-sax-parser="true"
enable-base-visitor="true" enable-json-parser="true" enable-json-builder="true" enable-native-parser="true" enable-native-builder="true"
enable-xml-parser="false" enable-xml-builder="false">
<entity name="bug-report" root="true">
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="domain" value-type="String" key="true"/>
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<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"/>
<element name="problem-url" value-type="String" />
<element name="excpetion" value-type="String" />
<entity-ref name="exception-item" type="map" names="exception-items" method-find-or-create="true"/>
</entity>
<entity name="exception-item">
<attribute name="id" value-type="String" key="true"/>
<attribute name="count" value-type="int" />
<element name="message" value-type="String" type="list" names="messages" />
</entity>
</model>
......@@ -82,6 +82,15 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.config.BugConfigManager</role>
<implementation>com.dianping.cat.system.config.BugConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.core.config.ConfigDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphItemBuilder</role>
<implementation>com.dianping.cat.report.page.dependency.graph.TopologyGraphItemBuilder</implementation>
......@@ -432,6 +441,15 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.bug.BugReportBuilder</role>
<implementation>com.dianping.cat.report.task.bug.BugReportBuilder</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.service.ReportService</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.matrix.MatrixReportBuilder</role>
<implementation>com.dianping.cat.report.task.matrix.MatrixReportBuilder</implementation>
......@@ -526,6 +544,9 @@
<requirement>
<role>com.dianping.cat.report.task.dependency.DependencyReportBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.bug.BugReportBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.metric.MetricBaselineReportBuilder</role>
</requirement>
......@@ -2463,6 +2484,30 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.bug.Handler</role>
<implementation>com.dianping.cat.report.page.bug.Handler</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.bug.JspViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.service.ReportService</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.advanced.ProductLineConfigManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.bug.JspViewer</role>
<implementation>com.dianping.cat.report.page.bug.JspViewer</implementation>
<requirements>
<requirement>
<role>org.unidal.web.mvc.view.model.ModelHandler</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.SystemModule</role>
<implementation>com.dianping.cat.system.SystemModule</implementation>
......@@ -2704,6 +2749,9 @@
<requirement>
<role>com.dianping.cat.system.config.ExceptionThresholdConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.config.BugConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.view.DomainNavManager</role>
</requirement>
......@@ -2727,6 +2775,15 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.config.BugConfigManager</role>
<implementation>com.dianping.cat.system.config.BugConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.core.config.ConfigDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.page.abtest.Handler</role>
<implementation>com.dianping.cat.system.page.abtest.Handler</implementation>
......
......@@ -56,6 +56,9 @@
<page name="externalError" title="externalError" path="externalError" template="default">
<description>ExternalError</description>
</page>
<page name="bug" title="Bug" path="bug" template="default">
<description>Bug</description>
</page>
</module>
<module name="system" path="s" default="false">
<page name="alarm" title="Alarm" default="true" path="alarm" view="/jsp/system/alarm/alarm.jsp">
......
<?xml version="1.0" encoding="utf-8"?>
<bug-config>
<exception>om.dianping.dpsf.exception.NetTimeoutException</exception>
<exception>com.dianping.dpsf.exception.DPSFTimeoutException</exception>
<exception>org.apache.http.conn.HttpHostConnectException</exception>
<exception>net.spy.memcached.internal.CheckedOperationTimeoutException</exception>
<exception>net.spy.memcached.internal.CheckedOperationTimeoutException</exception>
<exception>java.net.ConnectException</exception>
</bug-config>
\ No newline at end of file
<%@ page contentType="text/html; charset=utf-8" %>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.bug.Context" scope="request"/>
<jsp:useBean id="payload" type="com.dianping.cat.report.page.bug.Payload" scope="request"/>
<jsp:useBean id="model" type="com.dianping.cat.report.page.bug.Model" scope="request"/>
View of bug page under report
\ No newline at end of file
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<a:body>
<res:useJs value="${res.js.local['jquery.validate.min.js']}" target="head-js" />
<res:useJs value="${res.js.local['dependencyConfig.js']}" target="head-js" />
<res:useJs value="${res.js.local['alarm_js']}" target="head-js" />
<res:useCss value="${res.css.local['select2.css']}" target="head-css" />
<res:useJs value="${res.js.local['select2.min.js']}" target="head-js" />
<div class="row-fluid">
<div class="span2">
<%@include file="../configTree.jsp"%>
</div>
<div class="span10">
<form name="bugConfigUpdate" id="form" method="post"
action="${model.pageUri}?op=bugConfigUpdate">
<h4 class="text-center text-error" id="state">&nbsp;</h4>
<h4 class="text-center text-error">异常规范配置</h4>
<table class="table table-striped table-bordered table-condensed">
<tr>
<td><textarea name="bug" style="width:auto" rows="30" cols="150">${model.bug}</textarea></td>
</tr>
<tr>
<td><input class='btn btn-primary' id="addOrUpdateEdgeSubmit"
type="submit" name="submit" value="提交" /></td>
</tr>
</table>
</form>
</div>
</div>
</a:body>
<script type="text/javascript">
$(document).ready(function() {
$('#bugConfigUpdate').addClass('active');
var state = '${model.opState}';
if(state=='Success'){
$('#state').html('操作成功');
}else{
$('#state').html('操作失败');
}
setInterval(function(){
$('#state').html('&nbsp;');
},3000);
});
</script>
\ No newline at end of file
......@@ -14,6 +14,8 @@
<li class="text-right" id="metricConfigList"><a href="?op=metricConfigList"><strong>业务监控规则</strong></a></li>
<li class='nav-header'><h4>异常监控配置</h4></li>
<li class="text-right" id="exceptionConfigList"><a href="?op=exceptionThresholds"><strong>异常监控规则</strong></a></li>
<li class='nav-header'><h4>异常规范配置</h4></li>
<li class="text-right" id="bugConfigUpdate"><a href="?op=bugConfigUpdate"><strong>异常规范配置</strong></a></li>
</ul>
</div>
<style>
......
<?xml version="1.0" encoding="utf-8"?>
<bug-config>
<exception id="NetTimexception1"/>
<exception id="NetTimexception2"/>
<exception id="NetTimexception3"/>
<exception id="NetTimexception4"/>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<domain id="Cat" additivity="false">
<exception id="NetTimexception4"/>
<exception id="NetTimexception5"/>
<exception id="NetTimexception6"/>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
</domain>
<domain id="Cat1" additivity="true">
<exception id="NetTimexception5"/>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
<exception>NetTimexception2</exception>
</domain>
</bug-config>
\ No newline at end of file
......@@ -2,13 +2,13 @@
<bug-report startTime="2012-05-16 16:00:00" domain="All"
endTime="2012-05-16 16:59:59">
<domain id="Cat">
<problem-url>http://cat.dianpingoa.com/cat/r/p?domain=Cat&ip=All&date=2013080716&reportType=&op=view</problem-url>
<exception id="NPE" count="123">
<message url="http://cat.dianpingoa.com/cat/r/ShopServer"></message>
<message url="http://cat.dianpingoa.com/cat/r/ShopServer"></message>
<message url="http://cat.dianpingoa.com/cat/r/ShopServer"></message>
</exception>
<excpetion></excpetion>
<problem-url>http://cat.dianpingoa.com/cat/r/p</problem-url>
<exception-item id="NPE" count="123">
<message>http://cat.dianpingoa.com/cat/r/ShopServer</message>
<message>http://cat.dianpingoa.com/cat/r/ShopServer</message>
<message>http://cat.dianpingoa.com/cat/r/ShopServer</message>
</exception-item>
<exception-item></exception-item>
</domain>
<domain>
</domain>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册