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

meger state analyzer

......@@ -8,10 +8,10 @@ import org.unidal.initialization.Module;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.DomainManager;
import com.dianping.cat.abtest.spi.internal.ABTestCodec;
import com.dianping.cat.analysis.MessageAnalyzer;
import com.dianping.cat.consumer.CatConsumerAdvancedModule;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.advanced.MetricAnalyzer;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
......
......@@ -9,8 +9,8 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.DomainManager;
import com.dianping.cat.analysis.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.dependency.model.entity.Dependency;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.dependency.model.entity.Index;
......
......@@ -156,7 +156,7 @@
<role-hint>dependency</role-hint>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.DomainManager</role>
<role>com.dianping.cat.DomainManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.sql.DatabaseParser</role>
......
......@@ -198,9 +198,11 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
}
public void distribute(MessageTree tree) {
m_serverStateManager.addMessageTotal(tree.getDomain(), 1);
for (PeriodTask task : m_tasks) {
task.enqueue(tree);
}
}
public void finish() {
......
......@@ -8,11 +8,11 @@ import org.unidal.initialization.Module;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.DomainManager;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.analysis.MessageAnalyzer;
import com.dianping.cat.analysis.MessageAnalyzerManager;
import com.dianping.cat.consumer.CatConsumerModule;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.RealtimeConsumer;
import com.dianping.cat.consumer.dump.DumpAnalyzer;
import com.dianping.cat.consumer.event.EventAnalyzer;
......@@ -35,9 +35,7 @@ import com.dianping.cat.consumer.top.TopDelegate;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.consumer.transaction.TransactionDelegate;
import com.dianping.cat.core.config.ConfigDao;
import com.dianping.cat.core.dal.HostinfoDao;
import com.dianping.cat.core.dal.HourlyReportDao;
import com.dianping.cat.core.dal.ProjectDao;
import com.dianping.cat.message.spi.core.MessageConsumer;
import com.dianping.cat.service.DefaultReportManager;
import com.dianping.cat.service.ReportDelegate;
......@@ -57,9 +55,6 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(C(DomainManager.class).//
req(ServerConfigManager.class, ProjectDao.class, HostinfoDao.class));
all.add(C(MessageConsumer.class, RealtimeConsumer.class) //
.req(MessageAnalyzerManager.class, ServerStatisticManager.class));
......
......@@ -2,15 +2,18 @@ package com.dianping.cat.consumer.state;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.DomainManager;
import com.dianping.cat.analysis.AbstractMessageAnalyzer;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.state.model.entity.Detail;
import com.dianping.cat.consumer.state.model.entity.Machine;
import com.dianping.cat.consumer.state.model.entity.ProcessDomain;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.core.dal.Hostinfo;
import com.dianping.cat.message.spi.MessageTree;
......@@ -47,10 +50,41 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
Statistic state = m_serverStateManager.findState(start);
com.dianping.cat.consumer.state.model.entity.Message temp = machine.findOrCreateMessage(start);
Map<String, Long> totals = state.getMessageTotals();
long messageTotal = state.getMessageTotal();
temp.setTotal(messageTotal);
machine.setTotal(machine.getTotal() + messageTotal);
Map<String,Long> totalLosses = state.getMessageTotalLosses();
long messageTotalLoss = state.getMessageTotalLoss();
temp.setTotalLoss(messageTotalLoss);
Map<String,Double> sizes = state.getMessageSizes();
double messageSize = state.getMessageSize();
temp.setSize(messageSize);
machine.setTotal(messageTotal + machine.getTotal());
machine.setTotalLoss(messageTotalLoss + machine.getTotalLoss());
machine.setSize(messageSize + machine.getSize());
for (Entry<String,Long> entry : totals.entrySet()) {
String key = entry.getKey();
long value = entry.getValue();
ProcessDomain domain = machine.findOrCreateProcessDomain(key);
Detail detail = domain.findOrCreateDetail(start);
if(totals.containsKey(key)){
domain.setTotal(value + domain.getTotal());
detail.setTotal(value);
}
if(totalLosses.containsKey(key)){
domain.setTotalLoss(totalLosses.get(key) + domain.getTotalLoss());
detail.setTotalLoss(totalLosses.get(key));
}
if(sizes.containsKey(key)){
domain.setSize(sizes.get(key) + domain.getSize());
detail.setSize(sizes.get(key));
}
}
if (messageTotal > maxTps) {
maxTps = messageTotal;
}
......@@ -75,10 +109,6 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
temp.setNetworkTimeError(networkTimeError);
machine.setNetworkTimeError(machine.getNetworkTimeError() + networkTimeError);
long messageTotalLoss = state.getMessageTotalLoss();
temp.setTotalLoss(messageTotalLoss);
machine.setTotalLoss(machine.getTotalLoss() + messageTotalLoss);
long messageDump = state.getMessageDump();
temp.setDump(messageDump);
machine.setDump(machine.getDump() + messageDump);
......@@ -87,9 +117,7 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
temp.setDumpLoss(messageDumpLoss);
machine.setDumpLoss(machine.getDumpLoss() + messageDumpLoss);
double messageSize = state.getMessageSize();
temp.setSize(messageSize);
machine.setSize(machine.getSize() + messageSize);
int processDelayCount = state.getProcessDelayCount();
temp.setDelayCount(processDelayCount);
......@@ -124,7 +152,6 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
reports.put(ReportConstants.CAT, stateReport);
long startTime = getStartTime();
if (atEnd && !isLocalMode()) {
m_reportManager.storeHourlyReports(startTime, StoragePolicy.FILE_AND_DB);
} else {
......@@ -159,8 +186,10 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
buildStateInfo(machine);
StateReport startReport = m_reportManager.getHourlyReport(getStartTime(), ReportConstants.CAT, true);
machine.getProcessDomains().putAll(startReport.findOrCreateMachine(ip).getProcessDomains());
Map<String, ProcessDomain> processDomains = startReport.findOrCreateMachine(ip).getProcessDomains();
for(Map.Entry<String, ProcessDomain> entry:machine.getProcessDomains().entrySet()){
entry.getValue().getIps().addAll(processDomains.get(entry.getKey()).getIps());
}
return report;
}
......
package com.dianping.cat.consumer.state;
import com.dianping.cat.consumer.state.model.entity.Detail;
import com.dianping.cat.consumer.state.model.entity.Machine;
import com.dianping.cat.consumer.state.model.entity.Message;
import com.dianping.cat.consumer.state.model.entity.ProcessDomain;
......@@ -29,9 +30,10 @@ public class StateReportMerger extends DefaultMerger {
old.setTotal(old.getTotal() + machine.getTotal());
old.setTotalLoss(old.getTotalLoss() + machine.getTotalLoss());
old.setSize(old.getSize() + machine.getSize());
old.setDump(old.getDump() + machine.getDump());
old.setDumpLoss(old.getDumpLoss() + machine.getDumpLoss());
old.setSize(old.getSize() + machine.getSize());
old.setDelaySum(old.getDelaySum() + machine.getDelaySum());
old.setDelayCount(old.getDelayCount() + machine.getDelayCount());
......@@ -41,9 +43,6 @@ public class StateReportMerger extends DefaultMerger {
old.setPigeonTimeError(old.getPigeonTimeError() + machine.getPigeonTimeError());
old.setNetworkTimeError(old.getNetworkTimeError() + machine.getNetworkTimeError());
// old.setMaxTps(old.getMaxTps()+machine.getMaxTps());
// old.setAvgTps(old.getAvgTps()+machine.getAvgTps());
if (machine.getMaxTps() > old.getMaxTps()) {
old.setMaxTps(machine.getMaxTps());
}
......@@ -74,9 +73,19 @@ public class StateReportMerger extends DefaultMerger {
@Override
protected void mergeProcessDomain(ProcessDomain old, ProcessDomain processDomain) {
super.mergeProcessDomain(old, processDomain);
old.getIps().addAll(processDomain.getIps());
old.setSize(old.getSize()+processDomain.getSize());
old.setTotal(old.getTotal()+processDomain.getTotal());
old.setTotalLoss(old.getTotalLoss()+processDomain.getTotalLoss());
}
@Override
protected void mergeDetail(Detail old, Detail detail) {
old.setSize(detail.getSize() + old.getSize());
old.setTotal(detail.getTotal() + old.getTotal());
old.setTotalLoss(detail.getTotalLoss() + old.getTotalLoss());
}
@Override
public void visitStateReport(StateReport stateReport) {
......@@ -87,5 +96,7 @@ public class StateReportMerger extends DefaultMerger {
report.setStartTime(stateReport.getStartTime());
report.setEndTime(stateReport.getEndTime());
}
}
......@@ -8,9 +8,9 @@
<entity-ref name="machine" type="map" names="machines" method-find-or-create="true" />
</entity>
<entity name="machine">
<attribute name="ip" value-type="String" key="true" />
<attribute name="total" value-type="long" primitive="true" />
<attribute name="totalLoss" value-type="long" primitive="true" />
<attribute name="ip" value-type="String" key="true" />
<attribute name="maxTps" value-type="double" primitive="true" format="0.0" />
<attribute name="avgTps" value-type="double" primitive="true" format="0.0" />
<attribute name="blockTotal" value-type="long" primitive="true" />
......@@ -29,12 +29,25 @@
</entity>
<entity name="processDomain">
<attribute name="name" value-type="String" key="true" />
<attribute name="total" value-type="long" primitive="true"/>
<attribute name="totalLoss" value-type="long" primitive="true"/>
<attribute name="size" value-type="double" primitive="true" format="0.0"/>
<element name="ip" value-type="String" type="set" names="ips" />
<entity-ref name="detail" type="map" names="details" method-find-or-create="true" />
</entity>
<entity name="detail">
<attribute name="id" value-type="long" key="true" />
<attribute name="total" value-type="long" primitive="true" />
<attribute name="size" value-type="double" primitive="true" format="0.0" />
<attribute name="totalLoss" value-type="long" primitive="true" />
</entity>
<entity name="message">
<attribute name="id" value-type="long" key="true" />
<attribute name="time" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="total" value-type="long" primitive="true" />
<attribute name="size" value-type="double" primitive="true" format="0.0" />
<attribute name="totalLoss" value-type="long" primitive="true" />
<attribute name="pigeonTimeError" value-type="long" primitive="true" />
<attribute name="networkTimeError" value-type="long" primitive="true" />
......@@ -43,7 +56,6 @@
<attribute name="blockTime" value-type="long" primitive="true" />
<attribute name="dump" value-type="long" primitive="true" />
<attribute name="dumpLoss" value-type="long" primitive="true" />
<attribute name="size" value-type="double" primitive="true" format="0.0" />
<attribute name="delaySum" value-type="double" primitive="true" format="0.0" />
<attribute name="delayCount" value-type="int" primitive="true" />
</entity>
......
<plexus>
<components>
<component>
<role>com.dianping.cat.consumer.DomainManager</role>
<implementation>com.dianping.cat.consumer.DomainManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.HostinfoDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.message.spi.core.MessageConsumer</role>
<implementation>com.dianping.cat.consumer.RealtimeConsumer</implementation>
......@@ -321,7 +306,7 @@
<role-hint>state</role-hint>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.DomainManager</role>
<role>com.dianping.cat.DomainManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.statistic.ServerStatisticManager</role>
......
......@@ -2,7 +2,6 @@ package com.dianping.cat.consumer.core;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import junit.framework.Assert;
......@@ -32,11 +31,9 @@ public class ProblemReportAggregationTest {
MockRuleManger ruleManger = new MockRuleManger();
ruleManger.register();
aggregation.setRuleManger(ruleManger);
long start = (new Date()).getTime();
aggregation.visitProblemReport(reportOld);
System.out.println(((new Date()).getTime() - start) * 1.0 / 1000);
Assert.assertEquals(reportNew.toString().replaceAll("\r", ""),
aggregation.getReport().toString().replaceAll("\r", ""));
}
......@@ -46,9 +43,7 @@ public class ProblemReportAggregationTest {
List<AggregationRule> rules = getAggregationRule(AggregationConfigManager.PROBLEM_TYPE, "FrontEnd");
m_handler = new DefaultAggregationHandler();
long time = System.currentTimeMillis();
m_handler.register(rules);
System.out.println(System.currentTimeMillis()-time);
}
private AggregationRule buildRule(String pattern){
......
......@@ -20,6 +20,11 @@
<artifactId>foundation-service</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.unidal.webres</groupId>
<artifactId>WebResBase</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.unidal.framework</groupId>
<artifactId>dal-jdbc</artifactId>
......
package com.dianping.cat.consumer;
package com.dianping.cat;
import java.io.InputStream;
import java.net.HttpURLConnection;
......@@ -24,7 +24,6 @@ import org.unidal.webres.json.JsonArray;
import org.unidal.webres.json.JsonObject;
import com.dianping.cat.Cat;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.core.dal.Hostinfo;
import com.dianping.cat.core.dal.HostinfoDao;
import com.dianping.cat.core.dal.HostinfoEntity;
......
......@@ -43,12 +43,13 @@ public class PeriodTask implements Task, LogEnabled {
if (!result) { // trace queue overflow
m_queueOverflow++;
m_serverStateManager.addMessageTotalLoss(tree.getDomain(), 1);
m_serverStateManager.addMessageTotalLoss(1);
if (m_queueOverflow % CatConstants.ERROR_COUNT == 0) {
m_serverStateManager.addMessageTotalLoss(CatConstants.ERROR_COUNT);
m_logger.warn(m_analyzer.getClass().getSimpleName() + " queue overflow number " + m_queueOverflow);
}
}
return result;
}
......
......@@ -8,13 +8,16 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.CatCoreModule;
import com.dianping.cat.DomainManager;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.analysis.DefaultMessageAnalyzerManager;
import com.dianping.cat.analysis.MessageAnalyzerManager;
import com.dianping.cat.configuration.ClientConfigManager;
import com.dianping.cat.core.dal.DailyReportDao;
import com.dianping.cat.core.dal.HostinfoDao;
import com.dianping.cat.core.dal.HourlyReportDao;
import com.dianping.cat.core.dal.MonthlyReportDao;
import com.dianping.cat.core.dal.ProjectDao;
import com.dianping.cat.core.dal.TaskDao;
import com.dianping.cat.core.dal.WeeklyReportDao;
import com.dianping.cat.message.spi.MessageCodec;
......@@ -39,6 +42,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(C(DomainManager.class)//
.req(ServerConfigManager.class, ProjectDao.class, HostinfoDao.class));
all.add(C(TaskManager.class).req(TaskDao.class));
all.add(C(ServerConfigManager.class));
......
......@@ -277,7 +277,7 @@ public class TcpSocketReceiver implements LogEnabled {
if (flag == 0) {
m_serverStateManager.addMessageTotal(CatConstants.SUCCESS_COUNT);
if (m_processCount % (CatConstants.SUCCESS_COUNT * 1000) == 0) {
m_logger.info("The server processes message number " + m_processCount);
}
......
package com.dianping.cat.statistic;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class ServerStatistic {
private Map<Long, Statistic> m_statistics = new LinkedHashMap<Long, Statistic>();
private Map<Long, Statistic> m_statistics = new LinkedHashMap<Long, Statistic>(60);
public Statistic findOrCreate(Long time) {
Statistic state = m_statistics.get(time);
......@@ -24,13 +25,19 @@ public class ServerStatistic {
private long m_messageTotal;
private long m_messageDump;
private long m_messageTotalLoss;
private double m_messageSize;
private long m_messageDump;
private long m_messageDumpLoss;
private double m_messageSize;
private Map<String, Long> m_messageTotals = new HashMap<String, Long>(256);
private Map<String, Long> m_messageTotalLosses = new HashMap<String, Long>(256);
private Map<String, Double> m_messageSizes = new HashMap<String, Double>(256);
private double m_processDelaySum;
......@@ -74,8 +81,31 @@ public class ServerStatistic {
m_messageDumpLoss += messageDumpLoss;
}
public void addMessageSize(double messageSize) {
m_messageSize += messageSize;
public void addMessageTotal(String domain, long messageTotal) {
Long value = m_messageTotals.get(domain);
if (value != null) {
m_messageTotals.put(domain, value + messageTotal);
} else {
m_messageTotals.put(domain, messageTotal);
}
}
public void addMessageTotalLoss(String domain, long messageTotalLoss) {
Long value = m_messageTotalLosses.get(domain);
if (value != null) {
m_messageTotalLosses.put(domain, value + messageTotalLoss);
} else {
m_messageTotalLosses.put(domain, messageTotalLoss);
}
}
public void addMessageSize(String domain, double messageSize) {
Double value = m_messageSizes.get(domain);
if (value != null) {
m_messageSizes.put(domain, value + messageSize);
} else {
m_messageSizes.put(domain, messageSize);
}
}
public void addMessageTotal(long messageTotal) {
......@@ -86,6 +116,10 @@ public class ServerStatistic {
m_messageTotalLoss += messageTotalLoss;
}
public void addMessageSize(double messageSize) {
m_messageSize += messageSize;
}
public void addBlockTime(long blockTime) {
m_blockTime += blockTime;
}
......@@ -126,16 +160,16 @@ public class ServerStatistic {
return m_messageDumpLoss;
}
public double getMessageSize() {
return m_messageSize;
public Map<String, Double> getMessageSizes() {
return m_messageSizes;
}
public long getMessageTotal() {
return m_messageTotal;
public Map<String, Long> getMessageTotals() {
return m_messageTotals;
}
public long getMessageTotalLoss() {
return m_messageTotalLoss;
public Map<String, Long> getMessageTotalLosses() {
return m_messageTotalLosses;
}
public int getProcessDelayCount() {
......@@ -174,6 +208,18 @@ public class ServerStatistic {
return m_blockTime;
}
public long getMessageTotal() {
return m_messageTotal;
}
public long getMessageTotalLoss() {
return m_messageTotalLoss;
}
public double getMessageSize() {
return m_messageSize;
}
}
}
......@@ -48,21 +48,41 @@ public class ServerStatisticManager {
m_serverState.findOrCreate(time).addMessageDumpLoss(total);
}
public void addMessageSize(String domain, double size) {
Long time = getCurrentMinute();
m_serverState.findOrCreate(time).addMessageSize(domain, size);
addMessageSize(size);
}
public void addMessageSize(double size) {
Long time = getCurrentMinute();
m_serverState.findOrCreate(time).addMessageSize(size);
}
public void addMessageTotal(String domain, long total) {
Long time = getCurrentMinute();
m_serverState.findOrCreate(time).addMessageTotal(domain, total);
}
public void addMessageTotal(long total) {
Long time = getCurrentMinute();
m_serverState.findOrCreate(time).addMessageTotal(total);
}
public void addMessageTotalLoss(String domain, long total) {
Long time = getCurrentMinute();
m_serverState.findOrCreate(time).addMessageTotalLoss(domain, total);
addMessageTotalLoss(total);
}
public void addMessageTotalLoss(long total) {
Long time = getCurrentMinute();
m_serverState.findOrCreate(time).addMessageTotalLoss(total);
}
......
......@@ -64,9 +64,13 @@ public class LocalMessageBucketManager extends ContainerHolder implements Messag
private long m_total;
private Map<String, Long> m_totals = new HashMap<String,Long>();
private long m_totalSize;
private long m_lastTotalSize;
private Map<String, Long> m_totalSizes = new HashMap<String,Long>();
private Map<String, Long> m_lastTotalSizes = new HashMap<String,Long>();
private Logger m_logger;
......@@ -332,7 +336,8 @@ public class LocalMessageBucketManager extends ContainerHolder implements Messag
@Override
public void storeMessage(final MessageTree tree, final MessageId id) throws IOException {
// the message tree of one ip in the same hour should be put in one gzip thread
String key = id.getDomain() + id.getIpAddress() + id.getTimestamp();
String domain = id.getDomain();
String key = domain + id.getIpAddress() + id.getTimestamp();
int abs = key.hashCode();
if (abs < 0) {
......@@ -352,20 +357,30 @@ public class LocalMessageBucketManager extends ContainerHolder implements Messag
}
m_serverStateManager.addMessageDumpLoss(1);
}
m_total++;
Long value = m_totals.get(domain);
if (value == null) {
m_totals.put(domain, 1L);
} else {
m_totals.put(domain, value + 1);
}
if (m_total % (CatConstants.SUCCESS_COUNT) == 0) {
logState(tree);
}
if (value != null && value % CatConstants.SUCCESS_COUNT == 0) {
Long lastTotalSize = m_lastTotalSizes.get(domain);
Long totalSize = m_totalSizes.get(domain);
if(lastTotalSize == null){
lastTotalSize = 0L;
}
double amount = totalSize - lastTotalSize;
m_lastTotalSizes.put(domain, totalSize);
m_serverStateManager.addMessageSize(domain, amount);
}
}
private void logState(final MessageTree tree) {
double amount = m_totalSize - m_lastTotalSize;
m_lastTotalSize = m_totalSize;
m_serverStateManager.addMessageDump(CatConstants.SUCCESS_COUNT);
m_serverStateManager.addMessageSize(amount);
Message message = tree.getMessage();
if (message instanceof Transaction) {
long delay = System.currentTimeMillis() - tree.getMessage().getTimestamp()
......@@ -451,7 +466,14 @@ public class LocalMessageBucketManager extends ContainerHolder implements Messag
m_logger.error("Error when offer the block to the dump!");
}
}
String domain = id.getDomain();
m_totalSize += buf.readableBytes();
Long lastTotalSize = m_totalSizes.get(domain);
if (lastTotalSize == null) {
m_totalSizes.put(domain, (long) buf.readableBytes());
} else {
m_totalSizes.put(domain, lastTotalSize + buf.readableBytes());
}
if (t != null) {
t.setStatus(Message.SUCCESS);
......
<plexus>
<components>
<component>
<role>com.dianping.cat.DomainManager</role>
<implementation>com.dianping.cat.DomainManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.HostinfoDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.task.TaskManager</role>
<implementation>com.dianping.cat.task.TaskManager</implementation>
......
......@@ -6,8 +6,8 @@ import java.util.List;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.DomainManager;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
import com.dianping.cat.core.dal.DailyGraphDao;
......
package com.dianping.cat.report.page.cross;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.entity.Local;
import com.dianping.cat.consumer.cross.model.entity.Name;
......
......@@ -14,7 +14,7 @@ import org.unidal.web.mvc.annotation.InboundActionMeta;
import org.unidal.web.mvc.annotation.OutboundActionMeta;
import org.unidal.web.mvc.annotation.PayloadMeta;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
......
......@@ -7,7 +7,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.entity.Local;
import com.dianping.cat.consumer.cross.model.entity.Remote;
......
......@@ -9,7 +9,7 @@ import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.entity.Local;
import com.dianping.cat.consumer.cross.model.entity.Name;
......
......@@ -9,7 +9,7 @@ import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.entity.Local;
import com.dianping.cat.consumer.cross.model.entity.Remote;
......
......@@ -15,7 +15,7 @@ import org.unidal.web.mvc.annotation.OutboundActionMeta;
import org.unidal.web.mvc.annotation.PayloadMeta;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
import com.dianping.cat.home.dal.report.Event;
import com.dianping.cat.report.ReportPage;
......
package com.dianping.cat.report.page.metric;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
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;
import com.dianping.cat.Cat;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.service.ModelPeriod;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse;
import com.dianping.cat.system.page.abtest.service.ABTestService;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject(type = ModelService.class, value = "metric")
private ModelService<MetricReport> m_service;
@Inject
private PayloadNormalizer m_normalizePayload;
@Inject
private MetricConfigManager m_configManager;
@Inject
private ProductLineConfigManager m_productLineConfigManager;
@Inject
private ABTestService m_abtestService;
@Inject
private ReportService m_reportService;
@Inject
private BaselineService m_baselineService;
private static final String TUAN = "TuanGou";
private final Map<String, MetricReport> m_metricReportMap = new LinkedHashMap<String, MetricReport>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Entry<String, MetricReport> eldest) {
return size() > 1000;
}
};
private MetricReport getReportFromDB(String product, long date) {
String key = product + date;
MetricReport result = m_metricReportMap.get(key);
if (result == null) {
Date start = new Date(date);
Date end = new Date(date + TimeUtil.ONE_HOUR);
try {
result = m_reportService.queryMetricReport(product, start, end);
m_metricReportMap.put(key, result);
} catch (Exception e) {
Cat.logError(e);
}
}
return result;
}
private MetricReport getReport(ModelPeriod period, String product, long date) {
if (period == ModelPeriod.CURRENT || period == ModelPeriod.LAST) {
ModelRequest request = new ModelRequest(product, date);
if (m_service.isEligable(request)) {
ModelResponse<MetricReport> response = m_service.invoke(request);
MetricReport report = response.getModel();
return report;
} else {
throw new RuntimeException("Internal error: no eligable metric service registered for " + request + "!");
}
} else {
return getReportFromDB(product, date);
}
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "metric")
public void handleInbound(Context ctx) throws ServletException, IOException {
}
@Override
@OutboundActionMeta(name = "metric")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
normalize(model, payload);
Action action = payload.getAction();
Collection<ProductLine> productLines = m_productLineConfigManager.queryProductLines().values();
long date = payload.getDate();
switch (action) {
case METRIC:
MetricDisplay display = buildMetricsByProduct(date, payload.getProduct(), payload.getTest(), false);
model.setLineCharts(display.getLineCharts());
model.setAbtests(display.getAbtests());
break;
case DASHBOARD:
List<LineChart> allCharts = new ArrayList<LineChart>();
for (ProductLine productLine : productLines) {
MetricDisplay metricDisplay = buildMetricsByProduct(date, productLine.getId(), payload.getTest(), true);
List<LineChart> charts = metricDisplay.getLineCharts();
allCharts.addAll(charts);
}
model.setLineCharts(allCharts);
break;
}
model.setProductLines(productLines);
m_jspViewer.view(ctx, model);
}
private MetricDisplay buildMetricsByProduct(long date, String product, String abtestID, boolean isDashboard) {
Date startTime = new Date(date - 23 * TimeUtil.ONE_HOUR);
List<String> domains = m_productLineConfigManager.queryProductLineDomains(product);
List<MetricItemConfig> metricConfigs = m_configManager.queryMetricItemConfigs(new HashSet<String>(domains));
MetricDisplay display = new MetricDisplay(metricConfigs, abtestID, startTime,isDashboard);
display.setBaselineService(m_baselineService).setAbtestService(m_abtestService);
long time = startTime.getTime();
for (int i = 0; i < 24; i++) {
ModelPeriod period = ModelPeriod.getByTime(time);
MetricReport report = getReport(period, product, time);
if (report != null) {
display.visitMetricReport(i, report);
}
time = time + TimeUtil.ONE_HOUR;
}
display.generateDailyLineCharts();
if (abtestID.equals("-1")) {
display.generateBaselineChart();
}
return display;
}
private void normalize(Model model, Payload payload) {
model.setPage(ReportPage.METRIC);
m_normalizePayload.normalize(model, payload);
String poduct = payload.getProduct();
if (poduct == null || poduct.length() == 0) {
payload.setProduct(TUAN);
}
Date startTime = new Date(payload.getDate() - 23 * TimeUtil.ONE_HOUR);
Date endTime = new Date(payload.getDate() + TimeUtil.ONE_HOUR);
model.setStartTime(startTime);
model.setEndTime(endTime);
}
}
package com.dianping.cat.report.page.metric;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
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;
import com.dianping.cat.Cat;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.service.ModelPeriod;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse;
import com.dianping.cat.system.page.abtest.service.ABTestService;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject(type = ModelService.class, value = "metric")
private ModelService<MetricReport> m_service;
@Inject
private PayloadNormalizer m_normalizePayload;
@Inject
private MetricConfigManager m_configManager;
@Inject
private ProductLineConfigManager m_productLineConfigManager;
@Inject
private ABTestService m_abtestService;
@Inject
private ReportService m_reportService;
@Inject
private BaselineService m_baselineService;
private static final String TUAN = "TuanGou";
private final Map<String, MetricReport> m_metricReportMap = new LinkedHashMap<String, MetricReport>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Entry<String, MetricReport> eldest) {
return size() > 1000;
}
};
private MetricReport getReportFromDB(String product, long date) {
String key = product + date;
MetricReport result = m_metricReportMap.get(key);
if (result == null) {
Date start = new Date(date);
Date end = new Date(date + TimeUtil.ONE_HOUR);
try {
result = m_reportService.queryMetricReport(product, start, end);
m_metricReportMap.put(key, result);
} catch (Exception e) {
Cat.logError(e);
}
}
return result;
}
private MetricReport getReport(ModelPeriod period, String product, long date) {
if (period == ModelPeriod.CURRENT || period == ModelPeriod.LAST) {
ModelRequest request = new ModelRequest(product, date);
if (m_service.isEligable(request)) {
ModelResponse<MetricReport> response = m_service.invoke(request);
MetricReport report = response.getModel();
return report;
} else {
throw new RuntimeException("Internal error: no eligable metric service registered for " + request + "!");
}
} else {
return getReportFromDB(product, date);
}
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "metric")
public void handleInbound(Context ctx) throws ServletException, IOException {
}
@Override
@OutboundActionMeta(name = "metric")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
normalize(model, payload);
Action action = payload.getAction();
Collection<ProductLine> productLines = m_productLineConfigManager.queryProductLines().values();
long date = payload.getDate();
switch (action) {
case METRIC:
MetricDisplay display = buildMetricsByProduct(date, payload.getProduct(), payload.getTest(), false);
model.setLineCharts(display.getLineCharts());
model.setAbtests(display.getAbtests());
break;
case DASHBOARD:
List<LineChart> allCharts = new ArrayList<LineChart>();
for (ProductLine productLine : productLines) {
MetricDisplay metricDisplay = buildMetricsByProduct(date, productLine.getId(), payload.getTest(), true);
List<LineChart> charts = metricDisplay.getLineCharts();
allCharts.addAll(charts);
}
model.setLineCharts(allCharts);
break;
}
model.setProductLines(productLines);
m_jspViewer.view(ctx, model);
}
private MetricDisplay buildMetricsByProduct(long date, String product, String abtestID, boolean isDashboard) {
Date startTime = new Date(date - 23 * TimeUtil.ONE_HOUR);
List<String> domains = m_productLineConfigManager.queryProductLineDomains(product);
List<MetricItemConfig> metricConfigs = m_configManager.queryMetricItemConfigs(new HashSet<String>(domains));
MetricDisplay display = new MetricDisplay(metricConfigs, abtestID, startTime,isDashboard);
display.setBaselineService(m_baselineService).setAbtestService(m_abtestService);
long time = startTime.getTime();
for (int i = 0; i < 24; i++) {
ModelPeriod period = ModelPeriod.getByTime(time);
MetricReport report = getReport(period, product, time);
if (report != null) {
display.visitMetricReport(i, report);
}
time = time + TimeUtil.ONE_HOUR;
}
display.generateDailyLineCharts();
if (abtestID.equals("-1")) {
display.generateBaselineChart();
}
return display;
}
private void normalize(Model model, Payload payload) {
model.setPage(ReportPage.METRIC);
m_normalizePayload.normalize(model, payload);
String poduct = payload.getProduct();
if (poduct == null || poduct.length() == 0) {
payload.setProduct(TUAN);
}
Date startTime = new Date(payload.getDate() - 23 * TimeUtil.ONE_HOUR);
Date endTime = new Date(payload.getDate() + TimeUtil.ONE_HOUR);
model.setStartTime(startTime);
model.setEndTime(endTime);
}
}
package com.dianping.cat.report.page.metric;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.metric.model.entity.Abtest;
import com.dianping.cat.consumer.metric.model.entity.Group;
import com.dianping.cat.consumer.metric.model.entity.MetricItem;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.entity.Point;
import com.dianping.cat.consumer.metric.model.transform.BaseVisitor;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.metric.MetricType;
import com.dianping.cat.system.page.abtest.service.ABTestService;
public class MetricDisplay extends BaseVisitor {
private Map<String, LineChart> m_lineCharts = new LinkedHashMap<String, LineChart>();
private Map<Integer, com.dianping.cat.home.dal.abtest.Abtest> m_abtests = new HashMap<Integer, com.dianping.cat.home.dal.abtest.Abtest>();
private String m_abtest;
private Date m_start;
private String m_metricKey;
private String m_currentComputeType;
private ABTestService m_abtestService;
private BaselineService m_baselineService;
private int m_index;
private static final String SUM = MetricType.SUM.name();
private static final String COUNT = MetricType.COUNT.name();
private static final String AVG = MetricType.AVG.name();
private static final int INTERVAL = 10;
private static final int HOUR = 24;
private static final int MINUTE = 60;
private static final int POINT_NUM = HOUR * MINUTE / INTERVAL;
private static final String METRIC_STRING = "metric";
private boolean m_isDashboard;
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start) {
this(configs, abtest, start, false);
}
private boolean showAvg(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowAvgDashboard() && config.getShowAvg();
} else {
return config.getShowAvg();
}
}
private boolean showSum(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowSumDashboard() && config.getShowSum();
} else {
return config.getShowSum();
}
}
private boolean showCount(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowCountDashboard() && config.getShowCount();
} else {
return config.getShowCount();
}
}
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start, boolean isDashboard) {
m_isDashboard = isDashboard;
m_start = start;
m_abtest = abtest;
for (MetricItemConfig config : configs) {
String configKey = config.getId();
if (showSum(config)) {
String key = configKey + ":" + SUM;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_SUM));
}
if (showCount(config)) {
String key = configKey + ":" + COUNT;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_COUNT));
}
if (showAvg(config)) {
String key = configKey + ":" + AVG;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_AVG));
}
}
}
private LineChart createLineChart(String title) {
LineChart lineChart = new LineChart();
lineChart.setTitle(title);
lineChart.setStart(m_start);
lineChart.setSize(POINT_NUM);
lineChart.setStep(TimeUtil.ONE_MINUTE * INTERVAL);
return lineChart;
}
private com.dianping.cat.home.dal.abtest.Abtest findAbTest(int id) {
com.dianping.cat.home.dal.abtest.Abtest abtest = null;
if (id >= 0) {
abtest = m_abtestService.getABTestNameByRunId(id);
}
if (abtest == null) {
abtest = new com.dianping.cat.home.dal.abtest.Abtest();
abtest.setId(id);
abtest.setName(String.valueOf(id));
}
return abtest;
}
private LineChart findOrCreateChart(String type, String metricKey, String computeType) {
String key = metricKey + ":" + computeType;
LineChart chart = m_lineCharts.get(key);
if (chart == null && !m_isDashboard) {
if (computeType.equals(COUNT)) {
if (type.equals("C") || type.equals("S,C")) {
chart = createLineChart(key);
}
} else if (computeType.equals(AVG)) {
if (type.equals("T")) {
chart = createLineChart(key);
}
} else if (computeType.equals(SUM)) {
if (type.equals("S") || type.equals("S,C")) {
chart = createLineChart(key);
}
}
if (chart != null) {
m_lineCharts.put(key, chart);
}
}
return chart;
}
public void generateBaselineChart() {
for (String key : m_lineCharts.keySet()) {
LineChart lineChart = m_lineCharts.get(key);
Date yesterday = TaskHelper.todayZero(m_start);
int index = (int) ((m_start.getTime() + 8 * TimeUtil.ONE_HOUR) % TimeUtil.ONE_DAY / TimeUtil.ONE_MINUTE);
double[] yesterdayBaseline = m_baselineService.queryDailyBaseline(METRIC_STRING, key, yesterday);
Date today = TaskHelper.tomorrowZero(m_start);
double[] todayBaseline = m_baselineService.queryDailyBaseline(METRIC_STRING, key, today);
double[] value = new double[POINT_NUM];
double[] day = yesterdayBaseline;
for (int i = 0; i < POINT_NUM; i++) {
int j = (index + i * INTERVAL) % (HOUR * MINUTE);
if (j == 0 && index != 0) {
day = todayBaseline;
}
if (day == null) {
continue;
}
value[i] = sumOfArray(day, j);
}
lineChart.addSubTitle("Baseline");
lineChart.addValue(value);
}
}
public void generateDailyLineCharts() {
for (String key : m_lineCharts.keySet()) {
LineChart lineChart = m_lineCharts.get(key);
List<double[]> values = lineChart.getValues();
List<String> subTitles = lineChart.getSubTitles();
Map<String, double[]> resultMap = new HashMap<String, double[]>();
int i = 0;
for (String subTitle : subTitles) {
int splitIndex = subTitle.lastIndexOf(':');
int hour = Integer.parseInt(subTitle.substring(splitIndex + 1));
subTitle = subTitle.substring(0, splitIndex);
double[] value = values.get(i);
double[] newValue = resultMap.get(subTitle);
if (newValue == null) {
newValue = new double[POINT_NUM];
resultMap.put(subTitle, newValue);
}
for (int j = 0; j < MINUTE / INTERVAL; j++) {
newValue[hour * MINUTE / INTERVAL + j] = sumOfArray(value, j * INTERVAL);
}
i++;
}
values.clear();
subTitles.clear();
for (String subTitle : resultMap.keySet()) {
subTitles.add("Current");
values.add(resultMap.get(subTitle));
}
}
}
public Map<Integer, com.dianping.cat.home.dal.abtest.Abtest> getAbtests() {
return m_abtests;
}
public List<LineChart> getLineCharts() {
return new ArrayList<LineChart>(m_lineCharts.values());
}
public MetricDisplay setAbtestService(ABTestService service) {
m_abtestService = service;
return this;
}
public MetricDisplay setBaselineService(BaselineService baselineService) {
m_baselineService = baselineService;
return this;
}
private double sumOfArray(double[] values, int j) {
double result = 0;
for (int i = j; i < j + INTERVAL; i++) {
if (values[i] >= 0) {
result += values[i];
}
}
return result;
}
@Override
public void visitAbtest(Abtest abtest) {
String abtestId = abtest.getRunId();
int id = Integer.parseInt(abtestId);
com.dianping.cat.home.dal.abtest.Abtest temp = findAbTest(id);
m_abtests.put(id, temp);
if (m_abtest.equals(abtestId)) {
super.visitAbtest(abtest);
}
}
@Override
public void visitGroup(Group group) {
String id = group.getName();
if ("".equals(id)) {
id = "Default";
}
id = id + ":" + m_index;
double[] sum = new double[60];
double[] avg = new double[60];
double[] count = new double[60];
for (Point point : group.getPoints().values()) {
int index = point.getId();
sum[index] = point.getSum();
avg[index] = point.getAvg();
count[index] = point.getCount();
}
LineChart sumLine = findOrCreateChart(m_currentComputeType, m_metricKey, SUM);
if (sumLine != null) {
sumLine.addSubTitle(id);
sumLine.addValue(sum);
}
LineChart countLine = findOrCreateChart(m_currentComputeType, m_metricKey, COUNT);
if (countLine != null) {
countLine.addSubTitle(id);
countLine.addValue(count);
}
LineChart avgLine = findOrCreateChart(m_currentComputeType, m_metricKey, AVG);
if (avgLine != null) {
avgLine.addSubTitle(id);
avgLine.addValue(avg);
}
}
@Override
public void visitMetricItem(MetricItem metricItem) {
m_metricKey = metricItem.getId();
m_currentComputeType = metricItem.getType();
super.visitMetricItem(metricItem);
}
public void visitMetricReport(int index, MetricReport report) {
m_index = index;
visitMetricReport(report);
}
@Override
public void visitMetricReport(MetricReport metricReport) {
super.visitMetricReport(metricReport);
}
}
package com.dianping.cat.report.page.metric;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.metric.model.entity.Abtest;
import com.dianping.cat.consumer.metric.model.entity.Group;
import com.dianping.cat.consumer.metric.model.entity.MetricItem;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.entity.Point;
import com.dianping.cat.consumer.metric.model.transform.BaseVisitor;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.metric.MetricType;
import com.dianping.cat.system.page.abtest.service.ABTestService;
public class MetricDisplay extends BaseVisitor {
private Map<String, LineChart> m_lineCharts = new LinkedHashMap<String, LineChart>();
private Map<Integer, com.dianping.cat.home.dal.abtest.Abtest> m_abtests = new HashMap<Integer, com.dianping.cat.home.dal.abtest.Abtest>();
private String m_abtest;
private Date m_start;
private String m_metricKey;
private String m_currentComputeType;
private ABTestService m_abtestService;
private BaselineService m_baselineService;
private int m_index;
private static final String SUM = MetricType.SUM.name();
private static final String COUNT = MetricType.COUNT.name();
private static final String AVG = MetricType.AVG.name();
private static final int INTERVAL = 10;
private static final int HOUR = 24;
private static final int MINUTE = 60;
private static final int POINT_NUM = HOUR * MINUTE / INTERVAL;
private static final String METRIC_STRING = "metric";
private boolean m_isDashboard;
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start) {
this(configs, abtest, start, false);
}
private boolean showAvg(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowAvgDashboard() && config.getShowAvg();
} else {
return config.getShowAvg();
}
}
private boolean showSum(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowSumDashboard() && config.getShowSum();
} else {
return config.getShowSum();
}
}
private boolean showCount(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowCountDashboard() && config.getShowCount();
} else {
return config.getShowCount();
}
}
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start, boolean isDashboard) {
m_isDashboard = isDashboard;
m_start = start;
m_abtest = abtest;
for (MetricItemConfig config : configs) {
String configKey = config.getId();
if (showSum(config)) {
String key = configKey + ":" + SUM;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_SUM));
}
if (showCount(config)) {
String key = configKey + ":" + COUNT;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_COUNT));
}
if (showAvg(config)) {
String key = configKey + ":" + AVG;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_AVG));
}
}
}
private LineChart createLineChart(String title) {
LineChart lineChart = new LineChart();
lineChart.setTitle(title);
lineChart.setStart(m_start);
lineChart.setSize(POINT_NUM);
lineChart.setStep(TimeUtil.ONE_MINUTE * INTERVAL);
return lineChart;
}
private com.dianping.cat.home.dal.abtest.Abtest findAbTest(int id) {
com.dianping.cat.home.dal.abtest.Abtest abtest = null;
if (id >= 0) {
abtest = m_abtestService.getABTestNameByRunId(id);
}
if (abtest == null) {
abtest = new com.dianping.cat.home.dal.abtest.Abtest();
abtest.setId(id);
abtest.setName(String.valueOf(id));
}
return abtest;
}
private LineChart findOrCreateChart(String type, String metricKey, String computeType) {
String key = metricKey + ":" + computeType;
LineChart chart = m_lineCharts.get(key);
if (chart == null && !m_isDashboard) {
if (computeType.equals(COUNT)) {
if (type.equals("C") || type.equals("S,C")) {
chart = createLineChart(key);
}
} else if (computeType.equals(AVG)) {
if (type.equals("T")) {
chart = createLineChart(key);
}
} else if (computeType.equals(SUM)) {
if (type.equals("S") || type.equals("S,C")) {
chart = createLineChart(key);
}
}
if (chart != null) {
m_lineCharts.put(key, chart);
}
}
return chart;
}
public void generateBaselineChart() {
for (String key : m_lineCharts.keySet()) {
LineChart lineChart = m_lineCharts.get(key);
Date yesterday = TaskHelper.todayZero(m_start);
int index = (int) ((m_start.getTime() + 8 * TimeUtil.ONE_HOUR) % TimeUtil.ONE_DAY / TimeUtil.ONE_MINUTE);
double[] yesterdayBaseline = m_baselineService.queryDailyBaseline(METRIC_STRING, key, yesterday);
Date today = TaskHelper.tomorrowZero(m_start);
double[] todayBaseline = m_baselineService.queryDailyBaseline(METRIC_STRING, key, today);
double[] value = new double[POINT_NUM];
double[] day = yesterdayBaseline;
for (int i = 0; i < POINT_NUM; i++) {
int j = (index + i * INTERVAL) % (HOUR * MINUTE);
if (j == 0 && index != 0) {
day = todayBaseline;
}
if (day == null) {
continue;
}
value[i] = sumOfArray(day, j);
}
lineChart.addSubTitle("Baseline");
lineChart.addValue(value);
}
}
public void generateDailyLineCharts() {
for (String key : m_lineCharts.keySet()) {
LineChart lineChart = m_lineCharts.get(key);
List<double[]> values = lineChart.getValues();
List<String> subTitles = lineChart.getSubTitles();
Map<String, double[]> resultMap = new HashMap<String, double[]>();
int i = 0;
for (String subTitle : subTitles) {
int splitIndex = subTitle.lastIndexOf(':');
int hour = Integer.parseInt(subTitle.substring(splitIndex + 1));
subTitle = subTitle.substring(0, splitIndex);
double[] value = values.get(i);
double[] newValue = resultMap.get(subTitle);
if (newValue == null) {
newValue = new double[POINT_NUM];
resultMap.put(subTitle, newValue);
}
for (int j = 0; j < MINUTE / INTERVAL; j++) {
newValue[hour * MINUTE / INTERVAL + j] = sumOfArray(value, j * INTERVAL);
}
i++;
}
values.clear();
subTitles.clear();
for (String subTitle : resultMap.keySet()) {
subTitles.add("Current");
values.add(resultMap.get(subTitle));
}
}
}
public Map<Integer, com.dianping.cat.home.dal.abtest.Abtest> getAbtests() {
return m_abtests;
}
public List<LineChart> getLineCharts() {
return new ArrayList<LineChart>(m_lineCharts.values());
}
public MetricDisplay setAbtestService(ABTestService service) {
m_abtestService = service;
return this;
}
public MetricDisplay setBaselineService(BaselineService baselineService) {
m_baselineService = baselineService;
return this;
}
private double sumOfArray(double[] values, int j) {
double result = 0;
for (int i = j; i < j + INTERVAL; i++) {
if (values[i] >= 0) {
result += values[i];
}
}
return result;
}
@Override
public void visitAbtest(Abtest abtest) {
String abtestId = abtest.getRunId();
int id = Integer.parseInt(abtestId);
com.dianping.cat.home.dal.abtest.Abtest temp = findAbTest(id);
m_abtests.put(id, temp);
if (m_abtest.equals(abtestId)) {
super.visitAbtest(abtest);
}
}
@Override
public void visitGroup(Group group) {
String id = group.getName();
if ("".equals(id)) {
id = "Default";
}
id = id + ":" + m_index;
double[] sum = new double[60];
double[] avg = new double[60];
double[] count = new double[60];
for (Point point : group.getPoints().values()) {
int index = point.getId();
sum[index] = point.getSum();
avg[index] = point.getAvg();
count[index] = point.getCount();
}
LineChart sumLine = findOrCreateChart(m_currentComputeType, m_metricKey, SUM);
if (sumLine != null) {
sumLine.addSubTitle(id);
sumLine.addValue(sum);
}
LineChart countLine = findOrCreateChart(m_currentComputeType, m_metricKey, COUNT);
if (countLine != null) {
countLine.addSubTitle(id);
countLine.addValue(count);
}
LineChart avgLine = findOrCreateChart(m_currentComputeType, m_metricKey, AVG);
if (avgLine != null) {
avgLine.addSubTitle(id);
avgLine.addValue(avg);
}
}
@Override
public void visitMetricItem(MetricItem metricItem) {
m_metricKey = metricItem.getId();
m_currentComputeType = metricItem.getType();
super.visitMetricItem(metricItem);
}
public void visitMetricReport(int index, MetricReport report) {
m_index = index;
visitMetricReport(report);
}
@Override
public void visitMetricReport(MetricReport metricReport) {
super.visitMetricReport(metricReport);
}
}
\ No newline at end of file
......@@ -7,7 +7,9 @@ import java.util.Map;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.consumer.state.model.entity.Detail;
import com.dianping.cat.consumer.state.model.entity.Message;
import com.dianping.cat.consumer.state.model.entity.ProcessDomain;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.page.LineChart;
......@@ -50,9 +52,37 @@ public class StateGraphs {
double[] result = new double[size];
StateShow show = new StateShow(ip);
show.visitStateReport(report);
Map<Long,Detail> datas = null;
String domain = "";
int index = key.indexOf(':');
if(index != -1){
domain = key.substring(0,index);
key = key.substring(index+1);
ProcessDomain processDomain = show.getProcessDomainMap().get(domain);
if(processDomain != null){
datas = processDomain.getDetails();
}
}
Map<Long, Message> messages = show.getMessagesMap();
for (int i = 0; i < size; i++) {
if(index != -1){
if(datas == null){
continue;
}
Detail detail = datas.get(i * 60 * 1000 + start);
if(detail == null){
continue;
}
if (key.equalsIgnoreCase("total")) {
result[i] = detail.getTotal();
} else if (key.equalsIgnoreCase("totalLoss")) {
result[i] = detail.getTotalLoss();
} else if (key.equalsIgnoreCase("size")) {
result[i] = detail.getSize()/ 1024 / 1024;
}
continue;
}
Message message = messages.get(i * 60 * 1000 + start);
if (message != null) {
......@@ -92,7 +122,7 @@ public class StateGraphs {
private double[] getDataFromHourlySummary(List<StateReport> reports, long start, int size, String key, String ip) {
double[] result = new double[size];
for (StateReport report : reports) {
Date startTime = report.getStartTime();
StateShow show = new StateShow(ip);
......
......@@ -54,6 +54,10 @@ public class StateShow extends BaseVisitor {
Collections.sort(temp, new DomainCompartor());
return temp;
}
public Map<String,ProcessDomain> getProcessDomainMap() {
return m_processDomains;
}
public Machine getTotal() {
return m_total;
......
......@@ -9,8 +9,8 @@ import java.util.Set;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.DomainManager;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
......
......@@ -2,6 +2,7 @@ package com.dianping.cat.system.page.config;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
......@@ -240,6 +241,18 @@ public class Handler implements PageHandler<Context> {
case METRIC_CONFIG_ADD_OR_UPDATE:
metricConfigAdd(payload, model);
model.setProductLines(m_productLineConfigManger.queryProductLines());
Collection<ProductLine> productLines = model.getProductLines().values();
ProductLine productLine = null;
for(ProductLine pl : productLines){
if(pl.getId().equals(payload.getProductLineName())){
productLine = pl;
break;
}
}
if(productLine == null)
productLine = new ProductLine();
model.setProductLineToDomains(productLine.getDomains());
model.setProjects(queryAllProjects());
break;
case METRIC_CONFIG_ADD_OR_UPDATE_SUBMIT:
......
......@@ -19,6 +19,7 @@ import com.dianping.cat.home.dependency.config.entity.NodeConfig;
import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig;
import com.dianping.cat.home.dependency.exception.entity.ExceptionLimit;
import com.dianping.cat.system.SystemPage;
import com.dianping.cat.consumer.company.model.entity.Domain;
public class Model extends ViewModel<SystemPage, Action, Context> {
......@@ -53,6 +54,17 @@ public class Model extends ViewModel<SystemPage, Action, Context> {
private Map<ProductLine, List<MetricItemConfig>> m_productMetricConfigs;
private String m_bug;
private Map<String, Domain> m_productLineToDomains;
public Map<String, Domain> getProductLineToDomains() {
return m_productLineToDomains;
}
public void setProductLineToDomains(Map<String, Domain> productLineToDomains) {
m_productLineToDomains = productLineToDomains;
}
public Model(Context ctx) {
super(ctx);
......
......@@ -665,7 +665,7 @@
<role>com.dianping.cat.report.service.ReportService</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.DomainManager</role>
<role>com.dianping.cat.DomainManager</role>
</requirement>
</requirements>
</component>
......@@ -2339,7 +2339,7 @@
<role>com.dianping.cat.report.page.PayloadNormalizer</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.DomainManager</role>
<role>com.dianping.cat.DomainManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
......@@ -2358,8 +2358,8 @@
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.DomainManager</role>
<implementation>com.dianping.cat.consumer.DomainManager</implementation>
<role>com.dianping.cat.DomainManager</role>
<implementation>com.dianping.cat.DomainManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.core.dal.HostinfoDao</role>
......@@ -2729,7 +2729,7 @@
<role>com.dianping.cat.report.page.externalError.EventCollectManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.DomainManager</role>
<role>com.dianping.cat.DomainManager</role>
</requirement>
</requirements>
</component>
......
......@@ -47,6 +47,7 @@ var lineChartOptions = {
percent:0.8
},
y:{
title:"10分钟"
}
},
line:{
......
<%@ page session="false" language="java" pageEncoding="UTF-8" %>
<div class="tabbable " > <!-- Only required for left/right tabs -->
<ul class="nav nav-tabs alert-info">
<li class="text-right active"><a id="tab1Href" href="#tab1" data-toggle="tab"><strong>远程调用最多【URL】</strong></a></li>
<li class="text-right"><a id="tab2Href" href="#tab2" data-toggle="tab"><strong>远程调用最多【Service】</strong></a></li>
<li class="text-right"><a id="tab1Href" href="#tab3" data-toggle="tab"><strong>数据库最多【URL】</strong></a></li>
<li class="text-right"><a id="tab2Href" href="#tab4" data-toggle="tab"><strong>数据库最多【Service】</strong></a></li>
<li class="text-right"><a id="tab1Href" href="#tab5" data-toggle="tab"><strong>缓存最多【URL】</strong></a></li>
<li class="text-right"><a id="tab2Href" href="#tab6" data-toggle="tab"><strong>缓存最多【Service】</strong></a></li>
<li class="text-right active"><a id="tab1Href" href="#tab1" data-toggle="tab"><strong>远程调用最多【URL】</strong></a></li>
<li class="text-right"><a id="tab2Href" href="#tab2" data-toggle="tab"><strong>远程调用最多【Service】</strong></a></li>
<li class="text-right"><a id="tab1Href" href="#tab3" data-toggle="tab"><strong>数据库最多【URL】</strong></a></li>
<li class="text-right"><a id="tab2Href" href="#tab4" data-toggle="tab"><strong>数据库最多【Service】</strong></a></li>
<li class="text-right"><a id="tab1Href" href="#tab5" data-toggle="tab"><strong>缓存最多【URL】</strong></a></li>
<li class="text-right"><a id="tab2Href" href="#tab6" data-toggle="tab"><strong>缓存最多【Service】</strong></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tab1">
......
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.metric.Context" scope="request"/>
<jsp:useBean id="payload" type="com.dianping.cat.report.page.metric.Payload" scope="request"/>
<jsp:useBean id="model" type="com.dianping.cat.report.page.metric.Model" scope="request"/>
<a:body>
<res:useCss value='${res.css.local.table_css}' target="head-css" />
<res:useJs value="${res.js.local['svgchart.latest.min.js']}" target="head-js"/>
<res:useJs value="${res.js.local['baseGraph.js']}" target="head-js"/>
<script type="text/javascript">
$(document).ready(function() {
<c:forEach var="item" items="${model.lineCharts}" varStatus="status">
var data = ${item.jsonString};
graphLineChart(document.getElementById('${item.title}'), data);
</c:forEach>
var product = '${payload.product}';
var test = '${payload.test}';
$('#'+product).addClass('active');
$('#'+test).addClass('active');
$('i[tips]').popover();
});
</script>
<div class="report">
<table class="header">
<tr>
<td class="title">&nbsp;&nbsp;From ${w:format(model.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.endTime,'yyyy-MM-dd HH:mm:ss')}</td>
<td class="nav">
<c:forEach var="nav" items="${model.navs}">
&nbsp;[ <a href="${model.baseUri}?date=${model.date}&domain=${model.domain}&step=${nav.hours}&product=${payload.product}&test=${payload.test}&${navUrlPrefix}">${nav.title}</a> ]&nbsp;
</c:forEach>
&nbsp;[ <a href="${model.baseUri}?${navUrlPrefix}&product=${payload.product}">now</a> ]&nbsp;
</td>
</tr>
</table>
</br>
<div class="container-fluid">
<div class="row-fluid">
<div class="span2">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class='nav-header' id="${item.id}"><a href="?op=dashboard&date=${model.date}&domain=${model.domain}"><strong>业务大盘</strong></a></li>
<c:forEach var="item" items="${model.productLines}" varStatus="status">
<li class='nav-header' id="${item.id}"><a href="?date=${model.date}&domain=${model.domain}&product=${item.id}"><strong>${item.title}</strong></a></li>
<c:if test="${payload.product eq item.id }">
<c:forEach var="test" items="${model.abtests}" varStatus="status">
<c:if test="${test.value.id ne -1}">
<li id="${test.key}"><a href="?date=${model.date}&domain=${model.domain}&product=${payload.product}&test=${test.key}">${test.key}<i tips="" data-trigger="hover" class="icon-question-sign" data-toggle="popover" data-placement="right" data-content="${test.value.name}"></i></a>
</li>
</c:if>
</c:forEach>
</c:if>
</c:forEach>
<li >&nbsp;</li>
</ul>
</div><!--/.well -->
</div><!--/span-->
<div class="span10">
<h3 class='text-red'>说明:图中纵轴数据为10分钟数据之和</h3>
<c:forEach var="item" items="${model.lineCharts}" varStatus="status">
<div style="float:left;">
<h5 class="text-center text-error">${item.title}</h5>
<div id="${item.title}" class="metricGraph"></div>
</div>
</c:forEach>
</div>
<table class="footer">
<tr>
<td>[ end ]</td>
</tr>
</table>
</div>
</a:body>
<style type="text/css">
.row-fluid .span2{
width:10%;
}
.row-fluid .span10{
width:87%;
}
.well {
padding: 10px 10px 10px 19p;
}
.nav-list li a{
padding:2px 15px;
}
.nav li +.nav-header{
margin-top:2px;
}
.nav-header{
padding:5px 3px;
}
</style>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.metric.Context" scope="request"/>
<jsp:useBean id="payload" type="com.dianping.cat.report.page.metric.Payload" scope="request"/>
<jsp:useBean id="model" type="com.dianping.cat.report.page.metric.Model" scope="request"/>
<a:body>
<res:useCss value='${res.css.local.table_css}' target="head-css" />
<res:useJs value="${res.js.local['svgchart.latest.min.js']}" target="head-js"/>
<res:useJs value="${res.js.local['baseGraph.js']}" target="head-js"/>
<script type="text/javascript">
$(document).ready(function() {
<c:forEach var="item" items="${model.lineCharts}" varStatus="status">
var data = ${item.jsonString};
graphLineChart(document.getElementById('${item.title}'), data);
</c:forEach>
var product = '${payload.product}';
var test = '${payload.test}';
$('#'+product).addClass('active');
$('#'+test).addClass('active');
$('i[tips]').popover();
});
</script>
<div class="report">
<table class="header">
<tr>
<td class="title">&nbsp;&nbsp;From ${w:format(model.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.endTime,'yyyy-MM-dd HH:mm:ss')}</td>
<td class="nav">
<c:forEach var="nav" items="${model.navs}">
&nbsp;[ <a href="${model.baseUri}?date=${model.date}&domain=${model.domain}&step=${nav.hours}&product=${payload.product}&test=${payload.test}&${navUrlPrefix}">${nav.title}</a> ]&nbsp;
</c:forEach>
&nbsp;[ <a href="${model.baseUri}?${navUrlPrefix}&product=${payload.product}">now</a> ]&nbsp;
</td>
</tr>
</table>
</br>
<div class="container-fluid">
<div class="row-fluid">
<div class="span2">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class='nav-header' id="${item.id}"><a href="?op=dashboard&date=${model.date}&domain=${model.domain}"><strong>业务大盘</strong></a></li>
<c:forEach var="item" items="${model.productLines}" varStatus="status">
<li class='nav-header' id="${item.id}"><a href="?date=${model.date}&domain=${model.domain}&product=${item.id}"><strong>${item.title}</strong></a></li>
<c:if test="${payload.product eq item.id }">
<c:forEach var="test" items="${model.abtests}" varStatus="status">
<c:if test="${test.value.id ne -1}">
<li id="${test.key}"><a href="?date=${model.date}&domain=${model.domain}&product=${payload.product}&test=${test.key}">${test.key}<i tips="" data-trigger="hover" class="icon-question-sign" data-toggle="popover" data-placement="right" data-content="${test.value.name}"></i></a>
</li>
</c:if>
</c:forEach>
</c:if>
</c:forEach>
<li >&nbsp;</li>
</ul>
</div><!--/.well -->
</div><!--/span-->
<div class="span10">
<h3 class='text-red'>说明:图中纵轴数据为10分钟数据之和</h3>
<c:forEach var="item" items="${model.lineCharts}" varStatus="status">
<div style="float:left;">
<h5 class="text-center text-error">${item.title}</h5>
<div id="${item.title}" class="metricGraph"></div>
</div>
</c:forEach>
</div>
<table class="footer">
<tr>
<td>[ end ]</td>
</tr>
</table>
</div>
</a:body>
<style type="text/css">
.row-fluid .span2{
width:10%;
}
.row-fluid .span10{
width:87%;
}
.well {
padding: 10px 10px 10px 19p;
}
.nav-list li a{
padding:2px 15px;
}
.nav li +.nav-header{
margin-top:2px;
}
.nav-header{
padding:5px 3px;
}
</style>
......@@ -155,20 +155,35 @@
<table width="100%">
<tr class='odd'>
<td width="15%">处理项目列表</td>
<td width="15%">机器总数</td>
<td>项目对应机器列表</td>
<td colspan='2' width="10%">处理消息总量</td>
<td colspan='2' width="10%">丢失消息总量</td>
<td colspan='2' width="10%">压缩前消息大小(GB)</td>
<td width="5%">机器总数</td>
<td>项目对应机器列表</td>
</tr>
<c:forEach var="item" items="${model.state.processDomains}"
varStatus="status">
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<c:set var="lastIndex" value="${status.index}" />
<td>${item.name}</td>
<td>${w:size(item.ips)}</td>
<td style="text-align:left;">${item.total}</td>
<td><a href="?op=graph&ip=${model.ipAddress}&date=${model.date}&key=${item.name}:total" data-status="${item.name}:total" class="state_graph_link">[:: show ::]</a></td>
<td style="text-align:left;">${item.totalLoss}</td>
<td><a href="?op=graph&ip=${model.ipAddress}&date=${model.date}&key=${item.name}:totalLoss" data-status="${item.name}:totalLoss" class="state_graph_link">[:: show ::]</a></td>
<td style="text-align:left;">${w:format(item.size/1024/1024/1024,'0.00#')}</td>
<td><a href="?op=graph&ip=${model.ipAddress}&date=${model.date}&key=${item.name}:size" data-status="${item.name}:size" class="state_graph_link">[:: show ::]</a></td>
<td style="text-align:center;">${w:size(item.ips)}</td>
<td style="white-space: normal">${item.ips}</td>
</tr>
<tr class="graphs"><td colspan="7"><div id="${item.name}:total" style="display:none"></div></td></tr>
<tr class="graphs"><td colspan="7"><div id="${item.name}:totalLoss" style="display:none"></div></td></tr>
<tr class="graphs"><td colspan="7"><div id="${item.name}:size" style="display:none"></div></td></tr>
</c:forEach>
<tr style="color: white;">
<td>${lastIndex+1}</td>
<td></td>
<td></td>
<td></td>
<td>${model.state.totalSize}</td>
</tr>
</table>
......
......@@ -150,17 +150,28 @@
</table>
</br>
<table width="100%">
<tr class='odd'>
<td width="15%">处理项目列表</td><td width="5%">机器总数</td><td>项目对应机器列表</td>
<tr class='odd'>
<td width="15%">处理项目列表</td>
<td width="5%">处理消息总量</td>
<td width="5%">丢失消息总量</td>
<td width="5%">压缩前消息大小(GB)</td>
<td width="5%">机器总数</td>
<td>项目对应机器列表</td>
</tr>
<c:forEach var="item" items="${model.state.processDomains}"
varStatus="status">
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<c:set var="lastIndex" value="${status.index}"/>
<c:set var="lastIndex" value="${status.index}" />
<td>${item.name}</td>
<td>${w:size(item.ips)}</td>
<td style="white-space:normal">${item.ips}</td>
<td style="text-align:right;">${item.total}</td>
<td style="text-align:right;">${item.totalLoss}</td>
<td style="text-align:right;">${w:format(item.size/1024/1024/1024,'0.00#')}</td>
<td style="text-align:center;">${w:size(item.ips)}</td>
<td style="white-space: normal">${item.ips}</td>
</tr>
<tr class="graphs"><td colspan="7"><div id="${item.name}:total" style="display:none"></div></td></tr>
<tr class="graphs"><td colspan="7"><div id="${item.name}:totalLoss" style="display:none"></div></td></tr>
<tr class="graphs"><td colspan="7"><div id="${item.name}:size" style="display:none"></div></td></tr>
</c:forEach>
<tr style="color:white;"><td>${lastIndex+1}</td><td>${model.state.totalSize}</td></tr>
</table>
......
......@@ -9,6 +9,7 @@
<jsp:useBean id="model" type="com.dianping.cat.system.page.config.Model" scope="request"/>
<form name="metricConfigAddSumbit" id="form" method="post" action="${model.pageUri}?op=metricConfigAddSumbit">
<h4 class="text-center text-error" id="state">&nbsp;</h4>
<h4 class="text-center text-error">修改业务监控节点配置信息</h4>
<input name="productLineName" value="${payload.productLineName}" type="hidden"/>
......@@ -21,9 +22,9 @@
</c:if>
<c:if test="${empty model.metricItemConfig.domain}">
<select style="width:200px;" name="metricItemConfig.domain" id="id">
<c:forEach var="item" items="${model.projects}">
<option value="${item.domain}">${item.domain}</option>
</c:forEach>
<c:forEach var="item" items="${model.productLineToDomains}">
<option value="${item.key}">${item.key}</option>
</c:forEach>
</select>
</c:if>
</td>
......
......@@ -61,12 +61,35 @@
</tr>
<tr>
<td style="text-align: right" class="text-success">选择产品线的项目</td>
<td><select style="width: 500px;" name="domains" multiple=""
<td>
<table>
<tr>
<c:forEach var="item" items="${model.projects}" varStatus="status">
<c:choose>
<c:when test="${status.index mod 4 ne 0}">
<td>
<input type="checkbox" name=domains value="${item.domain}" />${item.domain}
</td>
</c:when>
<c:otherwise>
</tr>
<tr>
<td>
<input type="checkbox" name=domains value="${item.domain}" />${item.domain}
</td>
</c:otherwise>
</c:choose>
</c:forEach>
</tr>
</table>
</td>
<!-- <td><select style="width: 500px;" name="domains" multiple=""
id="domainSelect">
<c:forEach var="item" items="${model.projects}">
<option value="${item.domain}">${item.domain}</option>
</c:forEach>
</select></td>
</select></td> -->
</tr>
<tr>
<td>&nbsp;</td>
......
......@@ -5,8 +5,8 @@ import junit.framework.Assert;
import org.junit.Test;
import org.unidal.webres.helper.Files;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.DomainManager.ReloadDomainTask;
import com.dianping.cat.DomainManager;
import com.dianping.cat.DomainManager.ReloadDomainTask;
public class CMDBTest {
......
......@@ -6,7 +6,7 @@ import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.DomainManager;
public class ServiceBuilderTest extends ComponentTestCase{
......
......@@ -6,8 +6,7 @@ import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.report.task.utilization.UtilizationReportBuilder;
import com.dianping.cat.DomainManager;
public class UtilizationBuilderTest extends ComponentTestCase{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册