diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/RealtimeConsumer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/RealtimeConsumer.java index 494af4a03dccf6eadedef489827723ce4bd4856a..1d620f40f0aea6290dc4f764c5831085ae6abdae 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/RealtimeConsumer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/RealtimeConsumer.java @@ -455,9 +455,8 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer boolean result = m_queue.offer(tree); if (!result) { // trace queue overflow m_queueOverflow++; - if (m_queueOverflow >= 100) { - m_logger.warn(m_analyzer + " queue overflow"); - m_queueOverflow = 0; + if (m_queueOverflow % 1000 == 0) { + m_logger.warn(m_analyzer.getClass().getSimpleName() + " queue overflow number " + m_queueOverflow); } } return result; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index 5f5472796b656c8000e12ca161606dfd1201ae27..3a3b01a2a9b88c44045f7b8c244e63e5f7f9db90 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -1,13 +1,5 @@ package com.dianping.cat.consumer.build; -import static com.dianping.cat.consumer.problem.ProblemType.ERROR; -import static com.dianping.cat.consumer.problem.ProblemType.FAILURE; -import static com.dianping.cat.consumer.problem.ProblemType.HEARTBEAT; -import static com.dianping.cat.consumer.problem.ProblemType.LONG_SERVICE; -import static com.dianping.cat.consumer.problem.ProblemType.LONG_SQL; -import static com.dianping.cat.consumer.problem.ProblemType.LONG_URL; -import static com.dianping.cat.consumer.problem.ProblemType.LONG_CACHE; - import java.util.ArrayList; import java.util.List; @@ -27,14 +19,9 @@ import com.dianping.cat.consumer.ip.TopIpAnalyzer; import com.dianping.cat.consumer.logview.LogviewUploader; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; -import com.dianping.cat.consumer.problem.handler.ErrorHandler; -import com.dianping.cat.consumer.problem.handler.FailureHandler; +import com.dianping.cat.consumer.problem.handler.DefaultProblemHandler; import com.dianping.cat.consumer.problem.handler.Handler; -import com.dianping.cat.consumer.problem.handler.HeartbeatHandler; -import com.dianping.cat.consumer.problem.handler.LongCacheHandler; -import com.dianping.cat.consumer.problem.handler.LongServiceHandler; -import com.dianping.cat.consumer.problem.handler.LongSqlHandler; -import com.dianping.cat.consumer.problem.handler.LongUrlHandler; +import com.dianping.cat.consumer.problem.handler.LongExecutionHandler; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.hadoop.dal.HostinfoDao; import com.dianping.cat.hadoop.dal.LogviewDao; @@ -66,30 +53,16 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { String errorTypes = "Error,RuntimeException,Exception"; String failureTypes = "URL,SQL,Call,Cache"; - all.add(C(Handler.class, HEARTBEAT.getName(), HeartbeatHandler.class)); - - all.add(C(Handler.class, ERROR.getName(), ErrorHandler.class)// + all.add(C(Handler.class, "DefaultHandler", DefaultProblemHandler.class)// + .config(E("failureType").value(failureTypes))// .config(E("errorType").value(errorTypes))); - - all.add(C(Handler.class, FAILURE.getName(), FailureHandler.class)// - .config(E("failureType").value(failureTypes))); - - all.add(C(Handler.class, LONG_URL.getName(), LongUrlHandler.class) // + + all.add(C(Handler.class, "LongHandler", LongExecutionHandler.class) // .req(ServerConfigManager.class)); - all.add(C(Handler.class, LONG_SQL.getName(), LongSqlHandler.class) // - .req(ServerConfigManager.class)); - - all.add(C(Handler.class, LONG_SERVICE.getName(), LongServiceHandler.class) // - .req(ServerConfigManager.class)); - - all.add(C(Handler.class, LONG_CACHE.getName(), LongCacheHandler.class)); - all.add(C(ProblemAnalyzer.class).is(PER_LOOKUP) // .req(BucketManager.class, ReportDao.class, TaskDao.class) // - .req(Handler.class, new String[] { FAILURE.getName(), ERROR.getName(), // - LONG_URL.getName(), LONG_SQL.getName(), LONG_SERVICE.getName(),// - LONG_CACHE.getName(), HEARTBEAT.getName() }, "m_handlers")); + .req(Handler.class, new String[] { "DefaultHandler","LongHandler" }, "m_handlers")); all.add(C(TransactionAnalyzer.class).is(PER_LOOKUP) // .req(BucketManager.class, ReportDao.class, TaskDao.class)); diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java index 87b046282120ceb302e6cd0be72a65de3b566150..b020f704abc06f4bc7af9a2e64fc8efa741f4e7c 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java @@ -131,7 +131,6 @@ public class ProblemAnalyzer extends AbstractMessageAnalyzer impl } report.addIp(tree.getIpAddress()); - //Machine machine = findOrCreateMachine(report, tree); Machine machine = report.findOrCreateMachine(tree.getIpAddress()); int count = 0; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/FailureHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/DefaultProblemHandler.java similarity index 51% rename from cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/FailureHandler.java rename to cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/DefaultProblemHandler.java index bf641b041a77e7e2758088497ca9b011684bec83..75156db7f07cc38c400379ae577bfee12f7bf6c6 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/FailureHandler.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/DefaultProblemHandler.java @@ -7,25 +7,48 @@ import java.util.Set; import com.dianping.cat.consumer.problem.ProblemType; import com.dianping.cat.consumer.problem.model.entity.Entry; import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.message.Event; +import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; import com.dianping.cat.message.spi.MessageTree; import com.site.helper.Splitters; import com.site.lookup.annotation.Inject; -public class FailureHandler extends Handler { +public class DefaultProblemHandler extends Handler { + @Inject + private Set m_errorTypes; + @Inject private Set m_failureTypes; @Override public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); int count = 0; + Message message = tree.getMessage(); if (message instanceof Transaction) { - Transaction transaction = (Transaction) message; + count += processTransaction(machine, (Transaction) message, tree); + } else if (message instanceof Event) { + count += processEvent(machine, (Event) message, tree); + } else if (message instanceof Heartbeat) { + count += processHeartbeat(machine, (Heartbeat) message, tree); + } + + return count; + } + + private int processEvent(Machine machine, Event message, MessageTree tree) { + int count = 0; + + if (!message.getStatus().equals(Message.SUCCESS) && m_errorTypes.contains(message.getType())) { + String type = ProblemType.ERROR.getName(); + String status = message.getName(); - count += processTransaction(machine, transaction, tree); + Entry entry = findOrCreatEntry(machine, type, status); + updateEntry(tree, entry, 0); + + count++; } return count; @@ -34,9 +57,11 @@ public class FailureHandler extends Handler { private int processTransaction(Machine machine, Transaction transaction, MessageTree tree) { int count = 0; String transactionStatus = transaction.getStatus(); + if (!transactionStatus.equals(Transaction.SUCCESS)) { String type = transaction.getType(); String status = ""; + if (m_failureTypes.contains(type)) { type = transaction.getType().toLowerCase(); status = transaction.getName(); @@ -55,15 +80,30 @@ public class FailureHandler extends Handler { for (Message message : children) { if (message instanceof Transaction) { - Transaction temp = (Transaction) message; - - count += processTransaction(machine, temp, tree); + count += processTransaction(machine, (Transaction) message, tree); + } else if (message instanceof Event) { + count += processEvent(machine, (Event) message, tree); + } else if (message instanceof Heartbeat) { + count += processHeartbeat(machine, (Heartbeat) message, tree); } } return count; } + private int processHeartbeat(Machine machine, Heartbeat heartbeat, MessageTree tree) { + String type = ProblemType.HEARTBEAT.getName(); + String status = heartbeat.getName(); + Entry entry = findOrCreatEntry(machine, type, status); + + updateEntry(tree, entry, 0); + return 1; + } + + public void setErrorType(String type) { + m_errorTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); + } + public void setFailureType(String type) { m_failureTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/ErrorHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/ErrorHandler.java deleted file mode 100644 index 1d20dc850351e78de3e4c7d4dd8e23fe4fc2c6f5..0000000000000000000000000000000000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/ErrorHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import com.dianping.cat.consumer.problem.ProblemType; -import com.dianping.cat.consumer.problem.model.entity.Entry; -import com.dianping.cat.consumer.problem.model.entity.Machine; -import com.dianping.cat.message.Message; -import com.dianping.cat.message.Transaction; -import com.dianping.cat.message.spi.MessageTree; -import com.site.helper.Splitters; -import com.site.lookup.annotation.Inject; - -public class ErrorHandler extends Handler { - @Inject - private Set m_errorTypes; - - @Override - public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); - int count = 0; - - if (message instanceof Transaction) { - Transaction transaction = (Transaction) message; - - count += processTransaction(machine, transaction, tree); - } else { - count += processMessage(machine, message, tree); - } - - return count; - } - - private int processMessage(Machine machine, Message message, MessageTree tree) { - int count = 0; - - if (!message.getStatus().equals(Message.SUCCESS) && m_errorTypes.contains(message.getType())) { - String type = ProblemType.ERROR.getName(); - String status = message.getName(); - - Entry entry = findOrCreatEntry(machine, type, status); - updateEntry(tree, entry, 0); - - count++; - } - - return count; - } - - private int processTransaction(Machine machine, Transaction transaction, MessageTree tree) { - List children = transaction.getChildren(); - int count = 0; - - count += processMessage(machine, transaction, tree); - - for (Message message : children) { - if (message instanceof Transaction) { - Transaction temp = (Transaction) message; - - count += processTransaction(machine, temp, tree); - } else { - count += processMessage(machine, message, tree); - } - } - - return count; - } - - public void setErrorType(String type) { - m_errorTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); - } -} \ No newline at end of file diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/Handler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/Handler.java index 2acd2c31bff60e1b7a257925934974a76f93b334..1e73d8ab7effed877fe5bf785ad26745fcfc39df 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/Handler.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/Handler.java @@ -34,10 +34,11 @@ public abstract class Handler { public void updateEntry(MessageTree tree, Entry entry, int value) { Duration duration = entry.findOrCreateDuration(value); + List messages = duration.getMessages(); duration.incCount(); - if (duration.getMessages().size() < MAX_LOG_SIZE) { - duration.getMessages().add(tree.getMessageId()); + if (messages.size() < MAX_LOG_SIZE) { + messages.add(tree.getMessageId()); } JavaThread thread = entry.findOrCreateThread(tree.getThreadId()); @@ -50,10 +51,11 @@ public abstract class Handler { } Segment segment = thread.findOrCreateSegment(getSegmentByMessage(tree)); + List segmentMessages = segment.getMessages(); segment.incCount(); - if (segment.getMessages().size() < MAX_LOG_SIZE) { - segment.getMessages().add(tree.getMessageId()); + if (segmentMessages.size() < MAX_LOG_SIZE) { + segmentMessages.add(tree.getMessageId()); } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/HeartbeatHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/HeartbeatHandler.java deleted file mode 100644 index f53bc21161f26c7545803c0e549e710fd9fb00a0..0000000000000000000000000000000000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/HeartbeatHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import java.util.List; - -import com.dianping.cat.consumer.problem.ProblemType; -import com.dianping.cat.consumer.problem.model.entity.Entry; -import com.dianping.cat.consumer.problem.model.entity.Machine; -import com.dianping.cat.message.Heartbeat; -import com.dianping.cat.message.Message; -import com.dianping.cat.message.Transaction; -import com.dianping.cat.message.spi.MessageTree; - -public class HeartbeatHandler extends Handler { - - @Override - public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); - int count = 0; - - if (message instanceof Transaction) { - Transaction transaction = (Transaction) message; - - count += processTransaction(machine, transaction, tree); - } else if (message instanceof Heartbeat) { - count += processHeartbeat(machine, (Heartbeat) message, tree); - } - return count; - } - - private int processHeartbeat(Machine machine, Heartbeat heartbeat, MessageTree tree) { - String type = ProblemType.HEARTBEAT.getName(); - String status = heartbeat.getName(); - Entry entry = findOrCreatEntry(machine, type, status); - - updateEntry(tree, entry, 0); - return 1; - } - - private int processTransaction(Machine machine, Transaction transaction, MessageTree tree) { - List children = transaction.getChildren(); - int count = 0; - - for (Message message : children) { - if (message instanceof Transaction) { - Transaction temp = (Transaction) message; - - count += processTransaction(machine, temp, tree); - } else if (message instanceof Heartbeat) { - count += processHeartbeat(machine, (Heartbeat) message, tree); - } - } - - return count; - } -} \ No newline at end of file diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongCacheHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongCacheHandler.java deleted file mode 100644 index 418176c766f4af2d71ca3d31f5d9280c1b0cb0e7..0000000000000000000000000000000000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongCacheHandler.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import java.util.List; - -import com.dianping.cat.configuration.ServerConfigManager; -import com.dianping.cat.consumer.problem.ProblemType; -import com.dianping.cat.consumer.problem.model.entity.Entry; -import com.dianping.cat.consumer.problem.model.entity.Machine; -import com.dianping.cat.message.Message; -import com.dianping.cat.message.Transaction; -import com.dianping.cat.message.spi.MessageTree; -import com.site.lookup.annotation.Inject; - -public class LongCacheHandler extends Handler { - @Inject - private ServerConfigManager m_configManager; - - private int m_defaultCacheThreshold = 10; - - private int processTransaction(Machine machine, Transaction transaction, MessageTree tree) { - int count = 0; - - if (transaction instanceof Transaction && transaction.getType().startsWith("Cache.")) { - - long duration = ((Transaction) transaction).getDurationInMillis(); - - if (duration > m_defaultCacheThreshold) { - String type = ProblemType.LONG_CACHE.getName(); - String status = transaction.getName(); - - Entry entry = findOrCreatEntry(machine, type, status); - updateEntry(tree, entry, 0); - count++; - } - } - List messageList = transaction.getChildren(); - - for (Message message : messageList) { - if (message instanceof Transaction) { - Transaction temp = (Transaction) message; - - count += processTransaction(machine, temp, tree); - } - } - return count; - } - - @Override - public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); - int count = 0; - - if (message instanceof Transaction) { - Transaction transaction = (Transaction) message; - - count = processTransaction(machine, transaction, tree); - } - - return count; - } -} \ No newline at end of file diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongExecutionHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongExecutionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..14781f1967879ba64a48b5634efed6fb5bc98e3d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongExecutionHandler.java @@ -0,0 +1,194 @@ +package com.dianping.cat.consumer.problem.handler; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; + +import com.dianping.cat.configuration.ServerConfigManager; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.consumer.problem.ProblemType; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.message.Message; +import com.dianping.cat.message.Transaction; +import com.dianping.cat.message.spi.MessageTree; +import com.site.lookup.annotation.Inject; + +public class LongExecutionHandler extends Handler implements Initializable { + @Inject + private ServerConfigManager m_configManager; + + private int m_defaultCacheThreshold = 10; + + private int[] m_defaultLongServiceDuration = { 50, 100, 200 }; + + private int[] m_defaultLongSqlDuration = { 100, 500, 1000 ,2000 }; + + private int[] m_defaultLongUrlDuration = { 1000, 2000, 3000, 4000, 5000 }; + + private Map m_longServiceThresholds = new HashMap(); + + private Map m_longSqlThresholds = new HashMap(); + + private Map m_longUrlThresholds = new HashMap(); + + public int computeLongDuration(long duration, String domain, int[] m_defaultLongDuration, + Map longThresholds) { + int[] messageDuration = m_defaultLongDuration; + + for (int i = messageDuration.length - 1; i >= 0; i--) { + if (duration >= messageDuration[i]) { + return messageDuration[i]; + } + } + + Integer value = longThresholds.get(domain); + if (value == null) { + return -1; + } + if (duration >= value) { + return value; + } + return -1; + } + + @Override + public int handle(Machine machine, MessageTree tree) { + Message message = tree.getMessage(); + int count = 0; + + count += processLongUrl(machine, tree); + count += processLongService(machine, tree); + + if (message instanceof Transaction) { + Transaction transaction = (Transaction) message; + + count = processTransaction(machine, transaction, tree); + } + + return count; + } + + @Override + public void initialize() throws InitializationException { + Map domains = m_configManager.getLongConfigDomains(); + + for (Domain domain : domains.values()) { + Integer serviceThreshold = domain.getServiceThreshold(); + Integer urlThreshold = domain.getUrlThreshold(); + Integer sqlThreshold = domain.getSqlThreshold(); + + if (serviceThreshold != null) { + m_longServiceThresholds.put(domain.getName(), serviceThreshold); + } + if (urlThreshold != null) { + m_longUrlThresholds.put(domain.getName(), urlThreshold); + } + if (sqlThreshold != null) { + m_longSqlThresholds.put(domain.getName(), sqlThreshold); + } + } + } + + private int processLongCache(Machine machine, Transaction transaction, MessageTree tree, int count) { + long duration = ((Transaction) transaction).getDurationInMillis(); + + if (duration > m_defaultCacheThreshold) { + String type = ProblemType.LONG_CACHE.getName(); + String status = transaction.getName(); + + Entry entry = findOrCreatEntry(machine, type, status); + updateEntry(tree, entry, 0); + count++; + } + return count; + } + + private int processLongService(Machine machine, MessageTree tree) { + Message message = tree.getMessage(); + int count = 0; + + if (message instanceof Transaction + && ("Service".equals(message.getType()) || "PigeonService".equals(message.getType()))) { + + long duration = ((Transaction) message).getDurationInMillis(); + String domain = tree.getDomain(); + + long nomarizeDuration = computeLongDuration(duration, domain, m_defaultLongServiceDuration, + m_longServiceThresholds); + if (nomarizeDuration > 0) { + String type = ProblemType.LONG_SERVICE.getName(); + String status = message.getName(); + + Entry entry = findOrCreatEntry(machine, type, status); + updateEntry(tree, entry, (int) nomarizeDuration); + count++; + } + } + + return count; + } + + private int processLongSql(Machine machine, Transaction transaction, MessageTree tree, int count) { + long duration = transaction.getDurationInMillis(); + String domain = tree.getDomain(); + + long nomarizeDuration = computeLongDuration(duration, domain, m_defaultLongSqlDuration, m_longSqlThresholds); + if (nomarizeDuration > 0) { + String type = ProblemType.LONG_SQL.getName(); + String status = transaction.getName(); + + Entry entry = findOrCreatEntry(machine, type, status); + updateEntry(tree, entry, (int) nomarizeDuration); + count++; + } + return count; + } + + private int processLongUrl(Machine machine, MessageTree tree) { + Message message = tree.getMessage(); + int count = 0; + + if (message instanceof Transaction && "URL".equals(message.getType())) { + + long duration = ((Transaction) message).getDurationInMillis(); + String domain = tree.getDomain(); + + long nomarizeDuration = computeLongDuration(duration, domain, m_defaultLongUrlDuration, m_longUrlThresholds); + if (nomarizeDuration > 0) { + String type = ProblemType.LONG_URL.getName(); + String status = message.getName(); + + Entry entry = findOrCreatEntry(machine, type, status); + updateEntry(tree, entry, (int) nomarizeDuration); + count++; + } + } + + return count; + } + + private int processTransaction(Machine machine, Transaction transaction, MessageTree tree) { + int count = 0; + String transactionType = transaction.getType(); + + if (transactionType.startsWith("Cache.")) { + count = processLongCache(machine, transaction, tree, count); + } else if (transactionType.equals("SQL")) { + count = processLongSql(machine, transaction, tree, count); + } + + List messageList = transaction.getChildren(); + + for (Message message : messageList) { + if (message instanceof Transaction) { + count += processTransaction(machine, (Transaction) message, tree); + } + } + return count; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongServiceHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongServiceHandler.java deleted file mode 100644 index e72c90a01df6205910bac5234fe3ebaa2f5c7d7a..0000000000000000000000000000000000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongServiceHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import java.util.HashMap; -import java.util.Map; - -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; - -import com.dianping.cat.configuration.ServerConfigManager; -import com.dianping.cat.configuration.server.entity.Domain; -import com.dianping.cat.consumer.problem.ProblemType; -import com.dianping.cat.consumer.problem.model.entity.Entry; -import com.dianping.cat.consumer.problem.model.entity.Machine; -import com.dianping.cat.message.Message; -import com.dianping.cat.message.Transaction; -import com.dianping.cat.message.spi.MessageTree; -import com.site.lookup.annotation.Inject; - -public class LongServiceHandler extends Handler implements Initializable { - @Inject - private ServerConfigManager m_configManager; - - private Map m_thresholds = new HashMap(); - - private int[] m_defaultLongServiceDuration = { 50, 100, 200 }; - - @Override - public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); - int count = 0; - - if (message instanceof Transaction - && ("Service".equals(message.getType()) || "PigeonService".equals(message.getType()))) { - - long duration = ((Transaction) message).getDurationInMillis(); - String domain = tree.getDomain(); - - long nomarizeDuration = getDuration(duration, domain); - if (nomarizeDuration > 0) { - String type = ProblemType.LONG_SERVICE.getName(); - String status = message.getName(); - - Entry entry = findOrCreatEntry(machine, type, status); - updateEntry(tree, entry, (int) nomarizeDuration); - count++; - } - } - - return count; - } - - @Override - public void initialize() throws InitializationException { - Map domains = m_configManager.getLongConfigDomains(); - - for (Domain domain : domains.values()) { - if (domain.getServiceThreshold() != null) { - m_thresholds.put(domain.getName(), domain.getUrlThreshold()); - } - } - } - - public int getDuration(long duration, String domain) { - for (int i = m_defaultLongServiceDuration.length - 1; i >= 0; i--) { - if (duration >= m_defaultLongServiceDuration[i]) { - return m_defaultLongServiceDuration[i]; - } - } - Integer value = m_thresholds.get(domain); - if (value == null) { - return -1; - } - if (duration >= value) { - return value; - } - return -1; - } -} \ No newline at end of file diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongSqlHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongSqlHandler.java deleted file mode 100644 index d0aa0882422488ff50061d28d1392fab3da56095..0000000000000000000000000000000000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongSqlHandler.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; - -import com.dianping.cat.configuration.ServerConfigManager; -import com.dianping.cat.configuration.server.entity.Domain; -import com.dianping.cat.consumer.problem.ProblemType; -import com.dianping.cat.consumer.problem.model.entity.Entry; -import com.dianping.cat.consumer.problem.model.entity.Machine; -import com.dianping.cat.message.Message; -import com.dianping.cat.message.Transaction; -import com.dianping.cat.message.spi.MessageTree; -import com.site.lookup.annotation.Inject; - -public class LongSqlHandler extends Handler implements Initializable { - @Inject - private ServerConfigManager m_configManager; - - // private int m_defaultSqlThreshold; - - private Map m_thresholds = new HashMap(); - - private int[] m_defaultLongSqlDuration = { 100, 500, 1000 }; - - private int processTransaction(Machine machine, Transaction transaction, MessageTree tree) { - int count = 0; - String transactionType = transaction.getType(); - - if (transactionType.equals("SQL")) { - long duration = transaction.getDurationInMillis(); - String domain = tree.getDomain(); - - long nomarizeDuration = getDuration(duration, domain); - if (nomarizeDuration > 0) { - String type = ProblemType.LONG_SQL.getName(); - String status = transaction.getName(); - - Entry entry = findOrCreatEntry(machine, type, status); - updateEntry(tree, entry, (int) nomarizeDuration); - count++; - } - } - - List messageList = transaction.getChildren(); - - for (Message message : messageList) { - if (message instanceof Transaction) { - Transaction temp = (Transaction) message; - - count += processTransaction(machine, temp, tree); - } - } - return count; - } - - @Override - public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); - int count = 0; - - if (message instanceof Transaction) { - Transaction transaction = (Transaction) message; - - count = processTransaction(machine, transaction, tree); - } - - return count; - } - - @Override - public void initialize() throws InitializationException { - Map domains = m_configManager.getLongConfigDomains(); - - // m_defaultSqlThreshold = m_configManager.getLongSqlDefaultThreshold(); - - for (Domain domain : domains.values()) { - if (domain.getSqlThreshold() != null) { - m_thresholds.put(domain.getName(), domain.getSqlThreshold()); - } - } - } - - public int getDuration(long duration, String domain) { - for (int i = m_defaultLongSqlDuration.length - 1; i >= 0; i--) { - if (duration >= m_defaultLongSqlDuration[i]) { - return m_defaultLongSqlDuration[i]; - } - } - Integer value = m_thresholds.get(domain); - if (value == null) { - return -1; - } - if (duration >= value) { - return value; - } - return -1; - } -} \ No newline at end of file diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongUrlHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongUrlHandler.java deleted file mode 100644 index 3fd5705f5fba954ba4685fa3db8e8b4bf4e2659d..0000000000000000000000000000000000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/handler/LongUrlHandler.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import java.util.HashMap; -import java.util.Map; - -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; - -import com.dianping.cat.configuration.ServerConfigManager; -import com.dianping.cat.configuration.server.entity.Domain; -import com.dianping.cat.consumer.problem.ProblemType; -import com.dianping.cat.consumer.problem.model.entity.Entry; -import com.dianping.cat.consumer.problem.model.entity.Machine; -import com.dianping.cat.message.Message; -import com.dianping.cat.message.Transaction; -import com.dianping.cat.message.spi.MessageTree; -import com.site.lookup.annotation.Inject; - -public class LongUrlHandler extends Handler implements Initializable { - @Inject - private ServerConfigManager m_configManager; - - // private int m_defaultUrlThreshold; - - private Map m_thresholds = new HashMap(); - - private int[] m_defaultLongUrlDuration = { 1000, 2000, 3000, 4000, 5000 }; - - @Override - public int handle(Machine machine, MessageTree tree) { - Message message = tree.getMessage(); - int count = 0; - - if (message instanceof Transaction && "URL".equals(message.getType())) { - - long duration = ((Transaction) message).getDurationInMillis(); - String domain = tree.getDomain(); - - long nomarizeDuration = getDuration(duration, domain); - if (nomarizeDuration > 0) { - String type = ProblemType.LONG_URL.getName(); - String status = message.getName(); - - Entry entry = findOrCreatEntry(machine, type, status); - updateEntry(tree, entry, (int) nomarizeDuration); - count++; - } - } - - return count; - } - - @Override - public void initialize() throws InitializationException { - Map domains = m_configManager.getLongConfigDomains(); - - // m_defaultUrlThreshold = m_configManager.getLongUrlDefaultThreshold(); - for (Domain domain : domains.values()) { - if (domain.getUrlThreshold() != null) { - m_thresholds.put(domain.getName(), domain.getUrlThreshold()); - } - } - } - - public int getDuration(long duration, String domain) { - for (int i = m_defaultLongUrlDuration.length - 1; i >= 0; i--) { - if (duration >= m_defaultLongUrlDuration[i]) { - return m_defaultLongUrlDuration[i]; - } - } - Integer value = m_thresholds.get(domain); - if (value == null) { - return -1; - } - if (duration >= value) { - return value; - } - return -1; - } -} \ No newline at end of file diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index 9ed420ca77d0daa916c365d1795e3e7bc997322b..a49c6a922c5ecaadcc2daca0f4a031319aece8e3 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -23,60 +23,23 @@ com.dianping.cat.consumer.problem.handler.Handler - heartbeat - com.dianping.cat.consumer.problem.handler.HeartbeatHandler - - - com.dianping.cat.consumer.problem.handler.Handler - error - com.dianping.cat.consumer.problem.handler.ErrorHandler - - Error,RuntimeException,Exception - - - - com.dianping.cat.consumer.problem.handler.Handler - failure - com.dianping.cat.consumer.problem.handler.FailureHandler + DefaultHandler + com.dianping.cat.consumer.problem.handler.DefaultProblemHandler URL,SQL,Call,Cache + Error,RuntimeException,Exception com.dianping.cat.consumer.problem.handler.Handler - long-url - com.dianping.cat.consumer.problem.handler.LongUrlHandler + LongHandler + com.dianping.cat.consumer.problem.handler.LongExecutionHandler com.dianping.cat.configuration.ServerConfigManager - - com.dianping.cat.consumer.problem.handler.Handler - long-sql - com.dianping.cat.consumer.problem.handler.LongSqlHandler - - - com.dianping.cat.configuration.ServerConfigManager - - - - - com.dianping.cat.consumer.problem.handler.Handler - long-service - com.dianping.cat.consumer.problem.handler.LongServiceHandler - - - com.dianping.cat.configuration.ServerConfigManager - - - - - com.dianping.cat.consumer.problem.handler.Handler - long-cache - com.dianping.cat.consumer.problem.handler.LongCacheHandler - com.dianping.cat.consumer.problem.ProblemAnalyzer com.dianping.cat.consumer.problem.ProblemAnalyzer @@ -94,13 +57,8 @@ com.dianping.cat.consumer.problem.handler.Handler - failure - error - long-url - long-sql - long-service - long-cache - heartbeat + DefaultHandler + LongHandler m_handlers diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/handler/DefaultHandlerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/handler/DefaultHandlerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0e6abd1f240d91bd7ca47176af5ddd9a122406d4 --- /dev/null +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/handler/DefaultHandlerTest.java @@ -0,0 +1,47 @@ +package com.dianping.cat.consumer.problem.handler; + +import java.util.HashMap; +import java.util.Map; + +import junit.framework.Assert; + +import org.junit.Test; + +public class DefaultHandlerTest { + + private LongExecutionHandler m_handler; + + private int[] m_defaultLongUrlDuration = { 1000, 2000, 3000, 4000, 5000 }; + + private Map m_longUrlThresholds = new HashMap(); + + @Test + public void testHandler() { + m_handler = new LongExecutionHandler(); + + for (int i = 0; i < 1000; i++) { + Assert.assertEquals(-1, + m_handler.computeLongDuration(i, "domain", m_defaultLongUrlDuration, m_longUrlThresholds)); + } + for (int i = 1000; i < 2000; i++) { + Assert.assertEquals(1000, + m_handler.computeLongDuration(i, "domain", m_defaultLongUrlDuration, m_longUrlThresholds)); + } + for (int i = 2000; i < 3000; i++) { + Assert.assertEquals(2000, + m_handler.computeLongDuration(i, "domain", m_defaultLongUrlDuration, m_longUrlThresholds)); + } + for (int i = 3000; i < 4000; i++) { + Assert.assertEquals(3000, + m_handler.computeLongDuration(i, "domain", m_defaultLongUrlDuration, m_longUrlThresholds)); + } + for (int i = 4000; i < 5000; i++) { + Assert.assertEquals(4000, + m_handler.computeLongDuration(i, "domain", m_defaultLongUrlDuration, m_longUrlThresholds)); + } + for (int i = 5000; i < 8000; i++) { + Assert.assertEquals(5000, + m_handler.computeLongDuration(i, "domain", m_defaultLongUrlDuration, m_longUrlThresholds)); + } + } +} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/handler/LongurlHandlerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/handler/LongurlHandlerTest.java deleted file mode 100644 index c4823244738630008fdfb4d87e8df34b8a42f72c..0000000000000000000000000000000000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/handler/LongurlHandlerTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dianping.cat.consumer.problem.handler; - -import junit.framework.Assert; - -import org.junit.Test; - -public class LongurlHandlerTest { - - private LongUrlHandler m_handler; - - @Test - public void testHandler(){ - m_handler = new LongUrlHandler(); - - for(int i=0;i<1000;i++){ - Assert.assertEquals(-1, m_handler.getDuration(i, "domain")); - } - for(int i=1000;i<2000;i++){ - Assert.assertEquals(1000, m_handler.getDuration(i, "domain")); - } - for(int i=2000;i<3000;i++){ - Assert.assertEquals(2000, m_handler.getDuration(i, "domain")); - } - for(int i=3000;i<4000;i++){ - Assert.assertEquals(3000, m_handler.getDuration(i, "domain")); - } - for(int i=4000;i<5000;i++){ - Assert.assertEquals(4000, m_handler.getDuration(i, "domain")); - } - for(int i=5000;i<8000;i++){ - Assert.assertEquals(5000, m_handler.getDuration(i, "domain")); - } - } -} diff --git a/cat-home/src/main/java/com/dianping/cat/report/ReportModule.java b/cat-home/src/main/java/com/dianping/cat/report/ReportModule.java index 83c2e5efd67bc42fb18cb9957a9b0965484f55fb..7e50c9179ca63855f2edc3e409c52eda1adb2062 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/ReportModule.java +++ b/cat-home/src/main/java/com/dianping/cat/report/ReportModule.java @@ -35,7 +35,9 @@ com.dianping.cat.report.page.matrix.Handler.class, com.dianping.cat.report.page.monthreport.Handler.class, -com.dianping.cat.report.page.cross.Handler.class +com.dianping.cat.report.page.cross.Handler.class, + +com.dianping.cat.report.page.cache.Handler.class }) public class ReportModule extends AbstractModule { diff --git a/cat-home/src/main/java/com/dianping/cat/report/ReportPage.java b/cat-home/src/main/java/com/dianping/cat/report/ReportPage.java index 715d72e8d5188db76824d75a228d7080dd6a90c4..9fcd65c85872eb560a4261fab00be337394d72d5 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/ReportPage.java +++ b/cat-home/src/main/java/com/dianping/cat/report/ReportPage.java @@ -33,7 +33,9 @@ public enum ReportPage implements Page { MONTHREPORT("monthreport", "monthreport", "Monthreport", "Monthreport", false), - CROSS("cross", "cross", "Cross", "Cross", true); + CROSS("cross", "cross", "Cross", "Cross", true), + + CACHE("cache", "cache", "Cache", "Cache", true); private String m_name; diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/DefaultValueTranslater.java b/cat-home/src/main/java/com/dianping/cat/report/graph/DefaultValueTranslater.java index 8df5e7b53201f417a29d0794055727be369e71c6..cb33bd0437b535fac3622f8ba9532cb6a8c73efd 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/DefaultValueTranslater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/DefaultValueTranslater.java @@ -38,8 +38,12 @@ public class DefaultValueTranslater implements ValueTranslater { for (int i = 0; i < len; i++) { double value = values[i]; + double temp = value * height / maxValue; - result[i] = (int) (value * height / maxValue); + if (temp > 0 && temp < 1) { + temp = 1; + } + result[i] = (int) temp; } return result; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Action.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Action.java new file mode 100644 index 0000000000000000000000000000000000000000..299a4f946cb7fcd7d8fd41a310dff939456edb47 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Action.java @@ -0,0 +1,26 @@ +package com.dianping.cat.report.page.cache; + +public enum Action implements com.site.web.mvc.Action { + HOURLY_REPORT("view"), HISTORY_REPORT("history"); + + 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; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java new file mode 100644 index 0000000000000000000000000000000000000000..d00420ec10f6aaf15c03f129d9b55f5fff5f8dd0 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java @@ -0,0 +1,237 @@ +package com.dianping.cat.report.page.cache; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class CacheReport { + private String m_domain; + + private Set m_domains; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Set m_domainNames = new LinkedHashSet(); + + private Set m_ips = new LinkedHashSet(); + + private Map m_typeItems = new HashMap(); + + private Map m_nameItems = new HashMap(); + + private String m_sortBy; + + public void addNewTypeItem(TransactionType transactionType, EventType eventType) { + String key = transactionType.getId(); + CacheTypeItem item = m_typeItems.get(key); + if (item == null) { + item = new CacheTypeItem(); + item.setType(transactionType); + item.setMissed(eventType.getTotalCount()); + item.setHited((double) eventType.getTotalCount() / transactionType.getTotalCount()); + m_typeItems.put(key, item); + } + } + + public void addNewNameItem(TransactionName transactionName, EventName eventName) { + String key = transactionName.getId(); + CacheNameItem item = m_nameItems.get(key); + if (item == null) { + item = new CacheNameItem(); + item.setName(transactionName); + item.setMissed(eventName.getTotalCount()); + item.setHited((double) eventName.getTotalCount() / transactionName.getTotalCount()); + m_nameItems.put(key, item); + } + } + + public String getDomain() { + return m_domain; + } + + public void setDomain(String domain) { + m_domain = domain; + } + + public Set getDomains() { + return m_domains; + } + + public void setDomains(Set domains) { + m_domains = domains; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + public void setStartTime(java.util.Date startTime) { + m_startTime = startTime; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public void setEndTime(java.util.Date endTime) { + m_endTime = endTime; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public void setDomainNames(Set domainNames) { + m_domainNames = domainNames; + } + + public Set getIps() { + return m_ips; + } + + public void setIps(Set ips) { + m_ips = ips; + } + + public List getNameItems() { + List result = new ArrayList(m_nameItems.values()); + Collections.sort(result, new CacheNameItemCompator(m_sortBy)); + return result; + } + + public List getTypeItems() { + List result = new ArrayList(m_typeItems.values()); + Collections.sort(result, new CacheTypeItemCompator(m_sortBy)); + return result; + } + + public static class CacheNameItem { + private TransactionName m_name; + + private long m_missed; + + private double m_hited; + + public TransactionName getName() { + return m_name; + } + + public void setName(TransactionName name) { + m_name = name; + } + + public long getMissed() { + return m_missed; + } + + public void setMissed(long missed) { + m_missed = missed; + } + + public double getHited() { + return m_hited; + } + + public void setHited(double hited) { + m_hited = hited; + } + } + + public static class CacheTypeItem { + private TransactionType m_type; + + private long m_missed; + + private double m_hited; + + public TransactionType getType() { + return m_type; + } + + public void setType(TransactionType type) { + m_type = type; + } + + public long getMissed() { + return m_missed; + } + + public void setMissed(long missed) { + m_missed = missed; + } + + public double getHited() { + return m_hited; + } + + public void setHited(double hited) { + m_hited = hited; + } + } + + public void setSortBy(String sortBy) { + m_sortBy = sortBy; + } + + public static class CacheTypeItemCompator implements Comparator { + + private String m_sort; + + private CacheTypeItemCompator(String sort) { + m_sort = sort; + } + + @Override + public int compare(CacheTypeItem o1, CacheTypeItem o2) { + if (m_sort.equals("total")) { + return (int) (o2.getType().getTotalCount() - o1.getType().getTotalCount()); + } else if (m_sort.equals("missed")) { + return (int) (o2.getMissed() - o1.getMissed()); + } else if (m_sort.equals("hitPercent")) { + return (int) (o2.getHited() * 100 - o1.getHited() * 100); + } else if (m_sort.equals("avg")) { + return (int) (o2.getType().getAvg() * 100 - o1.getType().getAvg() * 100); + } else if (m_sort.equals("type")) { + return o1.getType().getId().compareTo(o2.getType().getId()); + } + return 0; + } + } + + public static class CacheNameItemCompator implements Comparator { + + private String m_sort; + + private CacheNameItemCompator(String sort) { + m_sort = sort; + } + + @Override + public int compare(CacheNameItem o1, CacheNameItem o2) { + if (m_sort.equals("total")) { + return (int) (o2.getName().getTotalCount() - o1.getName().getTotalCount()); + } else if (m_sort.equals("missed")) { + return (int) (o2.getMissed() - o1.getMissed()); + } else if (m_sort.equals("hitPercent")) { + return (int) (o2.getHited() * 100 - o1.getHited() * 100); + } else if (m_sort.equals("avg")) { + return (int) (o2.getName().getAvg() * 100 - o1.getName().getAvg() * 100); + } else if (m_sort.equals("name")) { + return o1.getName().getId().compareTo(o2.getName().getId()); + } + return 0; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Context.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Context.java new file mode 100644 index 0000000000000000000000000000000000000000..bd2d165e0d12b607503c866542e46ad9437211fe --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Context.java @@ -0,0 +1,7 @@ +package com.dianping.cat.report.page.cache; + +import com.dianping.cat.report.ReportContext; + +public class Context extends ReportContext { + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java new file mode 100644 index 0000000000000000000000000000000000000000..057fada30b78470e170dbcacd5be011862fc8af8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java @@ -0,0 +1,300 @@ +package com.dianping.cat.report.page.cache; + +import java.io.IOException; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.servlet.ServletException; + +import com.dianping.cat.Cat; +import com.dianping.cat.configuration.ServerConfigManager; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser; +import com.dianping.cat.hadoop.dal.Dailyreport; +import com.dianping.cat.hadoop.dal.DailyreportDao; +import com.dianping.cat.hadoop.dal.DailyreportEntity; +import com.dianping.cat.hadoop.dal.Report; +import com.dianping.cat.hadoop.dal.ReportDao; +import com.dianping.cat.hadoop.dal.ReportEntity; +import com.dianping.cat.helper.CatString; +import com.dianping.cat.report.ReportPage; +import com.dianping.cat.report.page.model.event.EventReportMerger; +import com.dianping.cat.report.page.model.spi.ModelRequest; +import com.dianping.cat.report.page.model.spi.ModelResponse; +import com.dianping.cat.report.page.model.spi.ModelService; +import com.dianping.cat.report.page.model.transaction.TransactionReportMerger; +import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.report.task.event.EventMerger; +import com.dianping.cat.report.task.transaction.TransactionMerger; +import com.site.dal.jdbc.DalException; +import com.site.lookup.annotation.Inject; +import com.site.lookup.util.StringUtils; +import com.site.web.mvc.PageHandler; +import com.site.web.mvc.annotation.InboundActionMeta; +import com.site.web.mvc.annotation.OutboundActionMeta; +import com.site.web.mvc.annotation.PayloadMeta; + +public class Handler implements PageHandler { + @Inject + private JspViewer m_jspViewer; + + @Inject + protected ReportDao m_reportDao; + + @Inject + private DailyreportDao m_dailyreportDao; + + @Inject + private EventMerger m_eventMerger; + + @Inject + private TransactionMerger m_transactionMerger; + + @Inject + private ServerConfigManager m_manager; + + @Inject(type = ModelService.class, value = "transaction") + private ModelService m_transactionService; + + @Inject(type = ModelService.class, value = "event") + private ModelService m_eventService; + + @Override + @PayloadMeta(Payload.class) + @InboundActionMeta(name = "cache") + public void handleInbound(Context ctx) throws ServletException, IOException { + // display only, no action here + } + + @Override + @OutboundActionMeta(name = "cache") + public void handleOutbound(Context ctx) throws ServletException, IOException { + Model model = new Model(ctx); + Payload payload = ctx.getPayload(); + + normalize(model, payload); + switch (payload.getAction()) { + case HOURLY_REPORT: + TransactionReport transactionReport = getHourlyTransactionReport(payload); + EventReport eventReport = getHourlyEventReport(payload); + CacheReport cacheReport = buildCacheReport(transactionReport, eventReport, payload.getType(),payload.getSortBy()); + + model.setReport(cacheReport); + break; + case HISTORY_REPORT: + TransactionReport transactionHistoryReport = getHistoryTransactionReport(payload); + EventReport eventHistoryReport = getHistoryEventReport(payload); + CacheReport cacheHistoryReport = buildCacheReport(transactionHistoryReport, eventHistoryReport, + payload.getType(),payload.getSortBy()); + + model.setReport(cacheHistoryReport); + break; + } + + m_jspViewer.view(ctx, model); + } + + private void normalize(Model model, Payload payload) { + if (StringUtils.isEmpty(payload.getDomain())) { + payload.setDomain(m_manager.getConsoleDefaultDomain()); + } + + String ip = payload.getIpAddress(); + if (StringUtils.isEmpty(ip)) { + payload.setIpAddress(CatString.ALL_IP); + } + model.setIpAddress(payload.getIpAddress()); + model.setAction(payload.getAction()); + model.setPage(ReportPage.CACHE); + model.setDisplayDomain(payload.getDomain()); + if (payload.getPeriod().isCurrent()) { + model.setCreatTime(new Date()); + } else { + model.setCreatTime(new Date(payload.getDate() + 60 * 60 * 1000 - 1000)); + } + if (payload.getAction() == Action.HISTORY_REPORT) { + String type = payload.getReportType(); + if (type == null || type.length() == 0) { + payload.setReportType("day"); + } + model.setReportType(payload.getReportType()); + payload.computeStartDate(); + model.setLongDate(payload.getDate()); + model.setCustomDate(payload.getHistoryStartDate(), payload.getHistoryEndDate()); + } + } + + private CacheReport buildCacheReport(TransactionReport transactionReport, EventReport eventReport, String type,String sortBy) { + TransactionReportVistor vistor = new TransactionReportVistor(); + vistor.setType(type).setSortBy(sortBy); + vistor.setEventReport(eventReport); + vistor.visitTransactionReport(transactionReport); + return vistor.getCacheReport(); + } + + private TransactionReport getHourlyTransactionReport(Payload payload) { + String domain = payload.getDomain(); + String date = String.valueOf(payload.getDate()); + String ipAddress = payload.getIpAddress(); + String type = payload.getType(); + + ModelRequest request = new ModelRequest(domain, payload.getPeriod()) // + .setProperty("date", date) // + .setProperty("ip", ipAddress); + + if (StringUtils.isEmpty(type)) { + request.setProperty("type", "Cache.web"); + ModelResponse response = m_transactionService.invoke(request); + TransactionReport webCacheReport = response.getModel(); + + request.setProperty("type", "Cache.memcached"); + ModelResponse memcachedResponse = m_transactionService.invoke(request); + TransactionReport memcachedReport = memcachedResponse.getModel(); + + request.setProperty("type", "Cache.kvdb"); + ModelResponse kvdbResponse = m_transactionService.invoke(request); + TransactionReport kvdbReport = kvdbResponse.getModel(); + + TransactionReportMerger merger = new TransactionReportMerger(new TransactionReport(domain)); + + merger.visitTransactionReport(webCacheReport); + merger.visitTransactionReport(memcachedReport); + merger.visitTransactionReport(kvdbReport); + return merger.getTransactionReport(); + } else { + request.setProperty("type", type); + ModelResponse response = m_transactionService.invoke(request); + return response.getModel(); + } + } + + private EventReport getHourlyEventReport(Payload payload) { + String domain = payload.getDomain(); + String date = String.valueOf(payload.getDate()); + String ipAddress = payload.getIpAddress(); + String type = payload.getType(); + + ModelRequest request = new ModelRequest(domain, payload.getPeriod()) // + .setProperty("date", date) // + .setProperty("ip", ipAddress); + + if (StringUtils.isEmpty(type)) { + request.setProperty("type", "Cache.web"); + ModelResponse response = m_eventService.invoke(request); + EventReport webCacheReport = response.getModel(); + + request.setProperty("type", "Cache.memcached"); + ModelResponse memcachedResponse = m_eventService.invoke(request); + EventReport memcachedReport = memcachedResponse.getModel(); + + request.setProperty("type", "Cache.kvdb"); + ModelResponse kvdbResponse = m_eventService.invoke(request); + EventReport kvdbReport = kvdbResponse.getModel(); + + EventReportMerger merger = new EventReportMerger(new EventReport(domain)); + + merger.visitEventReport(webCacheReport); + merger.visitEventReport(memcachedReport); + merger.visitEventReport(kvdbReport); + return merger.getEventReport(); + + } else { + request.setProperty("type", type); + ModelResponse response = m_eventService.invoke(request); + return response.getModel(); + } + } + + private TransactionReport getHistoryTransactionReport(Payload payload) { + String domain = payload.getDomain(); + Date start = payload.getHistoryStartDate(); + Date end = payload.getHistoryEndDate(); + Date currentDayStart = TaskHelper.todayZero(new Date()); + + TransactionReport transactionReport = null; + if (currentDayStart.getTime() == start.getTime()) { + try { + List reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "transaction", + ReportEntity.READSET_FULL); + List allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null, + ReportEntity.READSET_DOMAIN_NAME); + + Set domains = new HashSet(); + for (Report report : allReports) { + domains.add(report.getDomain()); + } + transactionReport = m_transactionMerger.mergeForDaily(domain, reports, domains); + } catch (DalException e) { + Cat.logError(e); + } + } else { + try { + List reports = m_dailyreportDao.findAllByDomainNameDuration(start, end, domain, "transaction", + DailyreportEntity.READSET_FULL); + TransactionReportMerger merger = new TransactionReportMerger(new TransactionReport(domain)); + for (Dailyreport report : reports) { + String xml = report.getContent(); + TransactionReport reportModel = DefaultSaxParser.parse(xml); + reportModel.accept(merger); + } + transactionReport = merger.getTransactionReport(); + } catch (Exception e) { + Cat.logError(e); + } + } + + if (transactionReport != null) { + transactionReport.setStartTime(start); + transactionReport.setEndTime(end); + } + return transactionReport; + } + + private EventReport getHistoryEventReport(Payload payload) { + String domain = payload.getDomain(); + Date start = payload.getHistoryStartDate(); + Date end = payload.getHistoryEndDate(); + Date currentDayStart = TaskHelper.todayZero(new Date()); + + EventReport eventReport = null; + if (currentDayStart.getTime() == start.getTime()) { + try { + List reports = m_reportDao.findAllByDomainNameDuration(start, end, domain, "event", + ReportEntity.READSET_FULL); + List allReports = m_reportDao.findAllByDomainNameDuration(start, end, null, null, + ReportEntity.READSET_DOMAIN_NAME); + + Set domains = new HashSet(); + for (Report report : allReports) { + domains.add(report.getDomain()); + } + eventReport = m_eventMerger.mergeForDaily(domain, reports, domains); + } catch (DalException e) { + Cat.logError(e); + } + } else { + try { + List reports = m_dailyreportDao.findAllByDomainNameDuration(start, end, domain, "event", + DailyreportEntity.READSET_FULL); + EventReportMerger merger = new EventReportMerger(new EventReport(domain)); + for (Dailyreport report : reports) { + String xml = report.getContent(); + EventReport reportModel = com.dianping.cat.consumer.event.model.transform.DefaultSaxParser.parse(xml); + reportModel.accept(merger); + } + eventReport = merger.getEventReport(); + } catch (Exception e) { + Cat.logError(e); + } + } + + if (eventReport != null) { + eventReport.setStartTime(start); + eventReport.setEndTime(end); + } + return eventReport; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/JspFile.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/JspFile.java new file mode 100644 index 0000000000000000000000000000000000000000..b5f665838159015c8f287d05bc8928c03ba34866 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/JspFile.java @@ -0,0 +1,17 @@ +package com.dianping.cat.report.page.cache; + +public enum JspFile { + HOURLY_REPORT("/jsp/report/cache.jsp"), HISTORY_REPORT("/jsp/report/cacheHistory.jsp"), + + ; + + private String m_path; + + private JspFile(String path) { + m_path = path; + } + + public String getPath() { + return m_path; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/JspViewer.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/JspViewer.java new file mode 100644 index 0000000000000000000000000000000000000000..ea35518c72eeaf45511a54b499628d3919db0868 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/JspViewer.java @@ -0,0 +1,22 @@ +package com.dianping.cat.report.page.cache; + +import com.dianping.cat.report.ReportPage; +import com.site.web.mvc.view.BaseJspViewer; + +public class JspViewer extends BaseJspViewer { + @Override + protected String getJspFilePath(Context ctx, Model model) { + Action action = model.getAction(); + + switch (action) { + case HISTORY_REPORT: + return JspFile.HISTORY_REPORT.getPath(); + case HOURLY_REPORT: + return JspFile.HOURLY_REPORT.getPath(); + default: + break; + } + + throw new RuntimeException("Unknown action: " + action); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Model.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Model.java new file mode 100644 index 0000000000000000000000000000000000000000..1f7569877189afc809777b2d2de5ed988ad865ac --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Model.java @@ -0,0 +1,61 @@ +package com.dianping.cat.report.page.cache; + +import java.util.ArrayList; +import java.util.Collection; + +import com.dianping.cat.report.page.AbstractReportModel; +import com.dianping.cat.report.view.StringSortHelper; + +public class Model extends AbstractReportModel { + private CacheReport m_report; + + private String m_queryName; + + public Model(Context ctx) { + super(ctx); + } + + @Override + public Action getDefaultAction() { + return Action.HISTORY_REPORT; + } + + @Override + public String getDomain() { + return m_report.getDomain(); + } + + @Override + public Collection getDomains() { + if (m_report == null) { + return new ArrayList(); + } else { + return StringSortHelper.sortDomain(m_report.getDomainNames()); + } + } + + public Collection getIps(){ + if (m_report == null) { + return new ArrayList(); + } else { + return StringSortHelper.sortDomain(m_report.getIps()); + } + } + + public CacheReport getReport() { + return m_report; + } + + public String getQueryName() { + return m_queryName; + } + + public void setQueryName(String queryName) { + m_queryName = queryName; + } + + public void setReport(CacheReport report) { + m_report = report; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Payload.java new file mode 100644 index 0000000000000000000000000000000000000000..42de9f4161a7cce2839af3106a75c0010c6485e4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Payload.java @@ -0,0 +1,76 @@ +package com.dianping.cat.report.page.cache; + +import com.dianping.cat.report.ReportPage; +import com.dianping.cat.report.page.AbstractReportPayload; +import com.site.web.mvc.ActionContext; +import com.site.web.mvc.payload.annotation.FieldMeta; + +public class Payload extends AbstractReportPayload { + @FieldMeta("op") + private Action m_action; + + private ReportPage m_page; + + @FieldMeta("query") + private String m_queryName; + + @FieldMeta("type") + private String m_type; + + @FieldMeta("sort") + private String m_sortBy; + + public Payload() { + super(ReportPage.CACHE); + } + + @Override + public Action getAction() { + return m_action; + } + + @Override + public ReportPage getPage() { + return m_page; + } + + public String getQueryName() { + return m_queryName; + } + + public String getType() { + return m_type; + } + + 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.CACHE); + } + + public void setQueryName(String queryName) { + m_queryName = queryName; + } + + public void setType(String type) { + m_type = type; + } + + public String getSortBy() { + return m_sortBy; + } + + public void setSortBy(String sortBy) { + m_sortBy = sortBy; + } + + @Override + public void validate(ActionContext ctx) { + if(m_action ==null){ + m_action = Action.HOURLY_REPORT; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/TransactionReportVistor.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/TransactionReportVistor.java new file mode 100644 index 0000000000000000000000000000000000000000..6c1ef4f139ffa64e7a23271fef88d0cdfc70b9ce --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/TransactionReportVistor.java @@ -0,0 +1,101 @@ +package com.dianping.cat.report.page.cache; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; +import com.dianping.cat.consumer.transaction.model.transform.BaseVisitor; + +public class TransactionReportVistor extends BaseVisitor { + + private CacheReport m_cacheReport = new CacheReport(); + + private EventReport m_eventReport; + + private String m_currentIp; + + private String m_currentType; + + private String m_type; + + private Set m_cacheTypes = new HashSet(); + + private String m_sortBy = "missed"; + + public CacheReport getCacheReport() { + return m_cacheReport; + } + + public TransactionReportVistor setType(String type) { + m_type = type; + return this; + } + + public TransactionReportVistor setEventReport(EventReport eventReport) { + m_eventReport = eventReport; + return this; + } + + public void setSortBy(String sortBy) { + if(sortBy!=null){ + m_sortBy = sortBy; + } + } + + @Override + public void visitName(TransactionName transactionName) { + com.dianping.cat.consumer.event.model.entity.Machine machine = m_eventReport.findOrCreateMachine(m_currentIp); + EventType eventType = machine.findOrCreateType(m_currentType); + EventName eventName = eventType.findOrCreateName(transactionName.getId() + ":missed"); + m_cacheReport.addNewNameItem(transactionName, eventName); + } + + @Override + public void visitMachine(Machine machine) { + m_currentIp = machine.getIp(); + super.visitMachine(machine); + } + + @Override + public void visitType(TransactionType transactionType) { + String id = transactionType.getId(); + if (m_cacheTypes.contains(id)) { + if (StringUtils.isEmpty(m_type)) { + m_currentType = transactionType.getId(); + com.dianping.cat.consumer.event.model.entity.Machine machine = m_eventReport + .findOrCreateMachine(m_currentIp); + EventType eventType = machine.findOrCreateType(m_currentType); + m_cacheReport.addNewTypeItem(transactionType, eventType); + + super.visitType(transactionType); + } else if (id.equalsIgnoreCase(m_type)) { + m_currentType = transactionType.getId(); + super.visitType(transactionType); + } + } + } + + @Override + public void visitTransactionReport(TransactionReport transactionReport) { + m_cacheTypes.add("Cache.memcached"); + m_cacheTypes.add("Cache.web"); + m_cacheTypes.add("Cache.kvdb"); + m_cacheReport.setSortBy(m_sortBy); + + super.visitTransactionReport(transactionReport); + m_cacheReport.setDomain(transactionReport.getDomain()); + m_cacheReport.setDomainNames(transactionReport.getDomainNames()); + m_cacheReport.setStartTime(transactionReport.getStartTime()); + m_cacheReport.setEndTime(transactionReport.getEndTime()); + m_cacheReport.setIps(transactionReport.getIps()); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java index 894c00668b1b93fd505df41f779949d8f975e672..7f907ae5bdde398ad03d05acf75370a94051bdee 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java @@ -166,8 +166,9 @@ public class Handler implements PageHandler { CrossReport methodReport = getHourlyReport(payload); MethodInfo methodInfo = new MethodInfo(payload.getHourDuration()); + methodInfo.setHostInfoDao(m_hostinfoDao); methodInfo.setClientIp(model.getIpAddress()).setCallSortBy(model.getCallSort()) - .setServiceSortBy(model.getServiceSort()); + .setServiceSortBy(model.getServiceSort()).setRemoteProject(payload.getProjectName()); methodInfo.setRemoteIp(payload.getRemoteIp()).setQuery(model.getQueryName()); methodInfo.visitCrossReport(methodReport); model.setReport(methodReport); @@ -200,8 +201,9 @@ public class Handler implements PageHandler { CrossReport historyMethodReport = getSummarizeReport(payload); MethodInfo historyMethodInfo = new MethodInfo(payload.getHourDuration()); + historyMethodInfo.setHostInfoDao(m_hostinfoDao); historyMethodInfo.setClientIp(model.getIpAddress()).setCallSortBy(model.getCallSort()) - .setServiceSortBy(model.getServiceSort()); + .setServiceSortBy(model.getServiceSort()).setRemoteProject(payload.getProjectName()); historyMethodInfo.setRemoteIp(payload.getRemoteIp()).setQuery(model.getQueryName()); historyMethodInfo.visitCrossReport(historyMethodReport); model.setReport(historyMethodReport); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/MethodInfo.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/MethodInfo.java index ec1a2487237dffe1302f1bdc2ec477242cb77d49..558c210e1ef49c139db44bd5f51fe65473533acf 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/MethodInfo.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/MethodInfo.java @@ -15,6 +15,10 @@ import com.dianping.cat.consumer.cross.model.entity.Name; import com.dianping.cat.consumer.cross.model.entity.Remote; import com.dianping.cat.consumer.cross.model.entity.Type; import com.dianping.cat.consumer.cross.model.transform.BaseVisitor; +import com.dianping.cat.hadoop.dal.Hostinfo; +import com.dianping.cat.hadoop.dal.HostinfoDao; +import com.dianping.cat.hadoop.dal.HostinfoEntity; +import com.site.dal.jdbc.DalException; public class MethodInfo extends BaseVisitor { @@ -24,6 +28,8 @@ public class MethodInfo extends BaseVisitor { private Map m_serviceProjectsInfo = new LinkedHashMap(); + private String m_remoteProject; + private String m_clientIp; private String m_currentType; @@ -40,6 +46,10 @@ public class MethodInfo extends BaseVisitor { private String m_serviceSortBy = "Avg"; + private HostinfoDao m_hostInfoDao; + + private static final String UNKNOWN_PROJECT = "UnknownProject"; + public MethodInfo(long reportDuration) { m_reportDuration = reportDuration; } @@ -168,18 +178,8 @@ public class MethodInfo extends BaseVisitor { @Override public void visitRemote(Remote remote) { String role = remote.getRole(); - if (role.endsWith("Server")) { - if (m_remoteIp.equals(HostInfo.ALL_SERVER_IP)) { - m_currentRole = remote.getRole(); - super.visitRemote(remote); - } - } else if (role.endsWith("Client")) { - if (m_remoteIp.equals(HostInfo.ALL_CLIENT_IP)) { - m_currentRole = remote.getRole(); - super.visitRemote(remote); - } - } - if(m_remoteIp.equals(remote.getId())){ + String ip = remote.getId(); + if (projectContains(m_remoteProject, ip, role) || m_remoteIp.equals(remote.getId())) { m_currentRole = remote.getRole(); super.visitRemote(remote); } @@ -190,4 +190,40 @@ public class MethodInfo extends BaseVisitor { m_currentType = type.getId(); super.visitType(type); } + + public void setRemoteProject(String remoteProject) { + m_remoteProject = remoteProject; + } + + public void setHostInfoDao(HostinfoDao hostInfoDao) { + m_hostInfoDao = hostInfoDao; + } + + private boolean projectContains(String projectName, String ip, String role) { + if (m_remoteIp.startsWith("All")) { + if (m_remoteProject.startsWith("AllClient") && role.endsWith("Client")) { + return true; + } else if (m_remoteProject.startsWith("AllServer") && role.endsWith("Server")) { + return true; + } + if (ip.indexOf(':') > 0) { + ip = ip.substring(0, ip.indexOf(':')); + } + try { + Hostinfo hostInfo = m_hostInfoDao.findByIp(ip, HostinfoEntity.READSET_FULL); + if (hostInfo != null) { + if (projectName.equalsIgnoreCase(hostInfo.getDomain())) { + return true; + } else { + return false; + } + } + } catch (DalException e) { + if (projectName.equals(UNKNOWN_PROJECT)) { + return true; + } + } + } + return false; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/DisplayHeartbeat.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/DisplayHeartbeat.java index 7c9708c0f8f44031e77d583942e8a94000e2e275..9c1104e378e5cd20d25dcf451b59ada4d3b5c452 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/DisplayHeartbeat.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/DisplayHeartbeat.java @@ -93,7 +93,7 @@ public class DisplayHeartbeat { m_catMessageProduced[minute] = period.getCatMessageProduced(); m_catMessageOverflow[minute] = period.getCatMessageOverflow(); period.setCatMessageSize(period.getCatMessageSize() / K / K); - m_catMessageSize[minute] = period.getCatMessageSize(); + m_catMessageSize[minute] = (double) period.getCatMessageSize() / K / K; m_newGcCount[minute] = period.getNewGcCount(); m_oldGcCount[minute] = period.getOldGcCount(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/DisplayMatrix.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/DisplayMatrix.java index ebafd13c2dfbdc189faf7450406da0884116f459..09dd3dba10c7846275a483a696f23f3612e9a7f6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/DisplayMatrix.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/DisplayMatrix.java @@ -273,7 +273,7 @@ public class DisplayMatrix { return (int) (o2.getCallAvg() * 100 - o1.getCallAvg() * 100); } if (m_sort.equalsIgnoreCase("CallAvgTotalTime")) { - return o2.getCallTime() - o1.getCacheMin(); + return o2.getCallTime() - o1.getCallTime(); } if (m_sort.equalsIgnoreCase("callTimePercent")) { return (int) (o2.getCallTimePercent() * 100 - o1.getCallTimePercent() * 100); diff --git a/cat-home/src/main/java/com/dianping/cat/report/view/NavigationBar.java b/cat-home/src/main/java/com/dianping/cat/report/view/NavigationBar.java index 632d7a076076f98a72d18ed7ce87145b58213931..4c121cfbc394623dc7a48efc32e6103853342732 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/view/NavigationBar.java +++ b/cat-home/src/main/java/com/dianping/cat/report/view/NavigationBar.java @@ -20,6 +20,8 @@ public class NavigationBar { ReportPage.MATRIX, ReportPage.CROSS, + + ReportPage.CACHE, ReportPage.IP, diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index ebdc7cbf2803da2918d4aa9b4c3c9cac64b60624..8f6a9590b1a90dcf31cf272f836929d61b26b868 100755 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -1561,5 +1561,43 @@ + + com.dianping.cat.report.page.cache.Handler + com.dianping.cat.report.page.cache.Handler + + + com.dianping.cat.report.page.cache.JspViewer + + + com.dianping.cat.hadoop.dal.ReportDao + + + com.dianping.cat.hadoop.dal.DailyreportDao + + + com.dianping.cat.report.task.event.EventMerger + + + com.dianping.cat.report.task.transaction.TransactionMerger + + + com.dianping.cat.configuration.ServerConfigManager + + + com.dianping.cat.report.page.model.spi.ModelService + transaction + m_transactionService + + + com.dianping.cat.report.page.model.spi.ModelService + event + m_eventService + + + + + com.dianping.cat.report.page.cache.JspViewer + com.dianping.cat.report.page.cache.JspViewer + diff --git a/cat-home/src/main/resources/META-INF/wizard/webapp/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/webapp/wizard.xml index 1007b7424382d64a50d12e95f1690ac86d99a6ec..2ef89d9dfdf71e45573fa48b3ebd7413be3a3d1d 100755 --- a/cat-home/src/main/resources/META-INF/wizard/webapp/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/webapp/wizard.xml @@ -47,6 +47,9 @@ Cross + + Cache + diff --git a/cat-home/src/main/webapp/jsp/report/cache.jsp b/cat-home/src/main/webapp/jsp/report/cache.jsp new file mode 100644 index 0000000000000000000000000000000000000000..19556e6fb16291a10571d3428905a47624aba03a --- /dev/null +++ b/cat-home/src/main/webapp/jsp/report/cache.jsp @@ -0,0 +1,103 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8"%> +<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%> +<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%> + + + + + + + + + +From ${w:format(report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(report.endTime,'yyyy-MM-dd HH:mm:ss')} + + + + +
+ + + + +
Machines:  [  + + All + + + All + +  ]  +  [  + + + ${ip} + + + ${ip} + + +  ]  + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeTotalMissedHit Rate(%)Avg(ms)TPS
${e.id}${w:format(e.totalCount,'#,###,###,###,##0')}${item.missed}${w:format(item.hited,'0.00%')}${w:format(e.avg,'0.0')}${w:format(e.tps,'0.0')}
+ + 支持多个字符串查询,例如sql|url|task,查询结果为包含任一sql、url、task的列 +
+ NameTotalMissedHit Rate(%)Avg(ms)TPS
${w:shorten(e.id, 80)}${w:format(e.totalCount,'#,###,###,###,##0')}${item.missed}${w:format(item.hited,'0.00%')}${w:format(e.avg,'0.0')}${w:format(e.tps,'0.0')}
+${lastIndex+1} + +
+ +
diff --git a/cat-home/src/main/webapp/jsp/report/cacheHistory.jsp b/cat-home/src/main/webapp/jsp/report/cacheHistory.jsp new file mode 100644 index 0000000000000000000000000000000000000000..5d8f3584994167cffa2329c1cb82e8d3c3e84b0a --- /dev/null +++ b/cat-home/src/main/webapp/jsp/report/cacheHistory.jsp @@ -0,0 +1,96 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8"%> +<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%> +<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%> + + + + + + + + + +From ${w:format(report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(report.endTime,'yyyy-MM-dd HH:mm:ss')} + + + + +
+ + + + +
Machines:   +  [  + + + ${ip} + + + ${ip} + + +  ]  + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeTotalMissedHit Rate(%)Avg(ms)TPS
${e.id}${w:format(e.totalCount,'#,###,###,###,##0')}${item.missed}${w:format(item.hited,'0.00%')}${w:format(e.avg,'0.0')}${w:format(e.tps,'0.0')}
+ + 支持多个字符串查询,例如sql|url|task,查询结果为包含任一sql、url、task的列 +
+ NameTotalMissedHit Rate(%)Avg(ms)TPS
+ ${w:shorten(e.id, 80)}${w:format(e.totalCount,'#,###,###,###,##0')}${item.missed}${w:format(item.hited,'0.00%')}${w:format(e.avg,'0.0')}${w:format(e.tps,'0.0')}
+${lastIndex+1} + +
+ +
diff --git a/cat-home/src/main/webapp/jsp/report/crossHistoryHost.jsp b/cat-home/src/main/webapp/jsp/report/crossHistoryHost.jsp index 1a705e55932665358c146345d8d8bc47bc3a0039..33e5108b71852ae9cd5937291e6d9cd351270ccf 100644 --- a/cat-home/src/main/webapp/jsp/report/crossHistoryHost.jsp +++ b/cat-home/src/main/webapp/jsp/report/crossHistoryHost.jsp @@ -57,7 +57,7 @@ ${callInfo.type} - ${callInfo.ip} + ${callInfo.ip} ${w:format(callInfo.totalCount,'#,###,###,###,##0')} ${w:format(callInfo.failureCount,'#,###,###,###,##0')} ${w:format(callInfo.failurePercent,'0.00%')} @@ -82,7 +82,7 @@ ${serviceInfo.type} - ${serviceInfo.ip} + ${serviceInfo.ip} ${w:format(serviceInfo.totalCount,'#,###,###,###,##0')} ${w:format(serviceInfo.failureCount,'#,###,###,###,##0')} ${w:format(serviceInfo.failurePercent,'0.00%')} diff --git a/cat-home/src/main/webapp/jsp/report/crossHost.jsp b/cat-home/src/main/webapp/jsp/report/crossHost.jsp index 7ae11e7588fdff2eb96583dd90303388d9864aaa..523205d04b207b59525227e7e753f133b3c0cc95 100644 --- a/cat-home/src/main/webapp/jsp/report/crossHost.jsp +++ b/cat-home/src/main/webapp/jsp/report/crossHost.jsp @@ -57,7 +57,7 @@ ${callInfo.type} - ${callInfo.ip} + ${callInfo.ip} ${w:format(callInfo.totalCount,'#,###,###,###,##0')} ${w:format(callInfo.failureCount,'#,###,###,###,##0')} ${w:format(callInfo.failurePercent,'0.00%')} @@ -82,7 +82,7 @@ ${serviceInfo.type} - ${serviceInfo.ip} + ${serviceInfo.ip} ${w:format(serviceInfo.totalCount,'#,###,###,###,##0')} ${w:format(serviceInfo.failureCount,'#,###,###,###,##0')} ${w:format(serviceInfo.failurePercent,'0.00%')} diff --git a/cat-home/src/main/webapp/jsp/report/problemHistoryReport.jsp b/cat-home/src/main/webapp/jsp/report/problemHistoryReport.jsp index 152c40e5481ce7170202e775d35bd34dba050af7..73940b35496ae485726d3c0f44af610e33c4868c 100644 --- a/cat-home/src/main/webapp/jsp/report/problemHistoryReport.jsp +++ b/cat-home/src/main/webapp/jsp/report/problemHistoryReport.jsp @@ -56,6 +56,7 @@ +