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 d083e42a4bdf8f37bcdb6847552175d7efbd6d02..70f435fb42ba28f713e945a8ef7768cdee733989 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 @@ -129,12 +129,12 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer MessageProducer cat = Cat.getProducer(); Transaction t = cat.newTransaction("Checkpoint", getClass().getSimpleName()); - t.setStatus(Message.SUCCESS); - try { for (Map.Entry e : m_currentAnalyzers.entrySet()) { e.getValue().doCheckpoint(); } + + t.setStatus(Message.SUCCESS); } catch (IOException e) { cat.logError(e); t.setStatus(e); diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index f38389f56b9cfe89a140497b5497209c06a8530f..357e1ba51cd5a28fcf604bb5179a3ad1334d304b 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -14,6 +14,7 @@ import com.dianping.cat.message.io.InMemoryReceiver; import com.dianping.cat.message.io.InMemorySender; import com.dianping.cat.message.io.MessageReceiver; import com.dianping.cat.message.io.MessageSender; +import com.dianping.cat.message.io.TcpSocketHierarchySender; import com.dianping.cat.message.io.TcpSocketReceiver; import com.dianping.cat.message.io.TcpSocketSender; import com.dianping.cat.message.io.TransportManager; @@ -75,6 +76,11 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { .req(MessageStatistics.class, "default", "m_statistics") // .req(MessageCodec.class, "plain-text", "m_codec")// .req(MessageQueue.class, "default", "m_queue")); + all.add(C(MessageSender.class, "tcp-socket-hierarchy", TcpSocketHierarchySender.class) // + .is(PER_LOOKUP) // + .req(MessageStatistics.class, "default", "m_statistics") // + .req(MessageCodec.class, "plain-text", "m_codec")// + .req(MessageQueue.class, "default", "m_queue")); all.add(C(MessageReceiver.class, "tcp-socket", TcpSocketReceiver.class) // .is(PER_LOOKUP) // .req(MessageCodec.class, "plain-text")); diff --git a/cat-core/src/main/java/com/dianping/cat/message/io/DefaultTransportManager.java b/cat-core/src/main/java/com/dianping/cat/message/io/DefaultTransportManager.java index 2fd9ec588b7db3e042c6a768673834da845c8588..03e25cdd0d36b92249a2385e2742f3ebc46c1b53 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/io/DefaultTransportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/message/io/DefaultTransportManager.java @@ -1,5 +1,7 @@ package com.dianping.cat.message.io; +import java.net.InetSocketAddress; +import java.util.ArrayList; import java.util.List; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; @@ -42,17 +44,31 @@ public class DefaultTransportManager extends ContainerHolder implements Transpor if (size == 0 || !config.isEnabled()) { m_sender = lookup(MessageSender.class, "in-memory"); - } else if (size == 1) { - TcpSocketSender sender = (TcpSocketSender) lookup(MessageSender.class, "tcp-socket"); - Server server = servers.get(0); + } else { + List addresses = new ArrayList(); - sender.setHost(server.getIp()); - sender.setPort(server.getPort()); - sender.initialize(); + for (Server server : servers) { + if (server.isEnabled()) { + addresses.add(new InetSocketAddress(server.getIp(), server.getPort())); + } + } - m_sender = sender; - } else { - throw new UnsupportedOperationException("Not implemented yet"); + if (addresses.isEmpty()) { + throw new RuntimeException("All servers in configuration are disabled!\r\n" + servers); + } else if (addresses.size() == 1) { + TcpSocketSender sender = (TcpSocketSender) lookup(MessageSender.class, "tcp-socket"); + + sender.setServerAddress(addresses.get(0)); + sender.initialize(); + m_sender = sender; + } else { + TcpSocketHierarchySender sender = (TcpSocketHierarchySender) lookup(MessageSender.class, + "tcp-socket-hierarchy"); + + sender.setServerAddresses(addresses); + sender.initialize(); + m_sender = sender; + } } } else { throw new IllegalArgumentException(String.format( diff --git a/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketHierarchySender.java b/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketHierarchySender.java new file mode 100644 index 0000000000000000000000000000000000000000..f6d1f9c8a51c1018e68e4b88b0514c03567f7ecb --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketHierarchySender.java @@ -0,0 +1,274 @@ +package com.dianping.cat.message.io; + +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Executors; + +import org.codehaus.plexus.logging.LogEnabled; +import org.codehaus.plexus.logging.Logger; +import org.jboss.netty.bootstrap.ClientBootstrap; +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.buffer.ChannelBuffers; +import org.jboss.netty.channel.ChannelFactory; +import org.jboss.netty.channel.ChannelFuture; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.ChannelPipeline; +import org.jboss.netty.channel.ChannelPipelineFactory; +import org.jboss.netty.channel.ChannelStateEvent; +import org.jboss.netty.channel.Channels; +import org.jboss.netty.channel.ExceptionEvent; +import org.jboss.netty.channel.MessageEvent; +import org.jboss.netty.channel.SimpleChannelHandler; +import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; + +import com.dianping.cat.message.spi.MessageCodec; +import com.dianping.cat.message.spi.MessageQueue; +import com.dianping.cat.message.spi.MessageStatistics; +import com.dianping.cat.message.spi.MessageTree; +import com.site.lookup.annotation.Inject; + +public class TcpSocketHierarchySender extends Thread implements MessageSender, LogEnabled { + @Inject + private MessageCodec m_codec; + + @Inject + private MessageQueue m_queue; + + @Inject + private MessageStatistics m_statistics; + + private List m_serverAddresses; + + private ChannelManager m_manager; + + private Logger m_logger; + + private transient boolean m_active; + + @Override + public void enableLogging(Logger logger) { + m_logger = logger; + } + + @Override + public void initialize() { + m_manager = new ChannelManager(m_logger, m_serverAddresses); + + this.setName("TcpSocketHierarchySender"); + this.start(); + m_manager.start(); + } + + @Override + public void run() { + m_active = true; + + while (m_active) { + try { + MessageTree tree = m_queue.poll(); + + if (tree != null) { + sendInternal(tree); + tree.setMessage(null); + } + } catch (Throwable t) { + m_logger.error("Error when sending message over TCP socket!", t); + } + } + + m_manager.releaseAll(); + } + + @Override + public void send(MessageTree tree) { + boolean result = m_queue.offer(tree); + + if (!result) { + if (m_statistics != null) { + m_statistics.onOverflowed(tree); + } + + m_logger.error("Message queue is full in tcp socket sender!"); + } + } + + private void sendInternal(MessageTree tree) { + ChannelFuture future = m_manager.getChannel(); + + if (future != null && future.getChannel().isOpen()) { + ChannelBuffer buf = ChannelBuffers.dynamicBuffer(10 * 1024); // 10K + + m_codec.encode(tree, buf); + + int size = buf.readableBytes(); + + future.getChannel().write(buf); + + if (m_statistics != null) { + m_statistics.onBytes(size); + } + } + } + + public void setCodec(MessageCodec codec) { + m_codec = codec; + } + + public void setServerAddresses(List serverAddresses) { + m_serverAddresses = serverAddresses; + } + + @Override + public void shutdown() { + m_active = false; + m_manager.shutdown(); + } + + static class ChannelManager extends Thread { + private List m_serverAddresses; + + private List m_futures; + + private ClientBootstrap m_bootstrap; + + private ChannelFuture m_activeFuture; + + private int m_activeIndex; + + private Logger m_logger; + + private ChannelFuture m_lastFuture; + + private boolean m_enabled = true; + + public ChannelManager(Logger logger, List serverAddresses) { + int len = serverAddresses.size(); + + m_logger = logger; + m_serverAddresses = serverAddresses; + m_futures = new ArrayList(Collections. nCopies(len, null)); + + ChannelFactory factory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), + Executors.newCachedThreadPool()); + ClientBootstrap bootstrap = new ClientBootstrap(factory); + + bootstrap.setPipelineFactory(new ChannelPipelineFactory() { + public ChannelPipeline getPipeline() { + return Channels.pipeline(new MyHandler(m_logger)); + } + }); + + bootstrap.setOption("tcpNoDelay", true); + bootstrap.setOption("keepAlive", true); + + m_bootstrap = bootstrap; + + for (int i = 0; i < len; i++) { + ChannelFuture future = createChannel(i); + + if (future != null) { + m_activeFuture = future; + m_activeIndex = i; + break; + } + } + } + + ChannelFuture createChannel(int index) { + InetSocketAddress address = m_serverAddresses.get(index); + ChannelFuture future = m_bootstrap.connect(address); + + future.awaitUninterruptibly(); + + if (!future.isSuccess()) { + future.getChannel().getCloseFuture().awaitUninterruptibly(); + m_logger.error("Error when try to connecting to " + address + ", message: " + future.getCause()); + return null; + } else { + m_logger.info("Connected to CAT server at " + address); + return future; + } + } + + public ChannelFuture getChannel() { + if (m_lastFuture != null && m_lastFuture != m_activeFuture) { + m_lastFuture.getChannel().close(); + m_lastFuture = null; + } + + return m_activeFuture; + } + + public void releaseAll() { + for (ChannelFuture future : m_futures) { + if (future != null) { + future.getChannel().getCloseFuture().awaitUninterruptibly(); + } + } + + m_bootstrap.getFactory().releaseExternalResources(); + m_futures = null; + } + + @Override + public void run() { + try { + while (m_enabled) { + if (m_activeFuture != null && !m_activeFuture.getChannel().isOpen()) { + m_activeIndex = m_serverAddresses.size(); + } + + for (int i = 0; i < m_activeIndex; i++) { + ChannelFuture future = createChannel(i); + + if (future != null) { + m_lastFuture = m_activeFuture; + m_activeFuture = future; + m_activeIndex = i; + break; + } + } + + Thread.sleep(1000 * 10); // check every 10 seconds + } + } catch (InterruptedException e) { + // ignore + } + } + + public void shutdown() { + m_enabled = false; + } + } + + static class MyHandler extends SimpleChannelHandler { + private Logger m_logger; + + public MyHandler(Logger logger) { + m_logger = logger; + } + + @Override + public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { + m_logger.warn("Channel disconnected by remote address: " + e.getChannel().getRemoteAddress()); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { + e.getChannel().close(); + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { + ChannelBuffer buf = (ChannelBuffer) e.getMessage(); + + while (buf.readable()) { + // TODO do something here + System.out.println((char) buf.readByte()); + System.out.flush(); + } + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketSender.java b/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketSender.java index 754ab9277c0dbcc3d8a03c60c2bc3137a1a7f249..f369766569714b820bf35ddc42600cf4a65aecff 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketSender.java +++ b/cat-core/src/main/java/com/dianping/cat/message/io/TcpSocketSender.java @@ -29,18 +29,14 @@ import com.site.lookup.annotation.Inject; public class TcpSocketSender extends Thread implements MessageSender, LogEnabled { @Inject private MessageCodec m_codec; - + @Inject private MessageQueue m_queue; - + @Inject private MessageStatistics m_statistics; - - @Inject - private String m_host; - @Inject - private int m_port = 2280; // default port number from phone, C:2, A:2, T:8 + private InetSocketAddress m_serverAddress; private ChannelFactory m_factory; @@ -63,8 +59,8 @@ public class TcpSocketSender extends Thread implements MessageSender, LogEnabled @Override public void initialize() { - if (m_host == null) { - throw new RuntimeException("No host was configured for TcpSocketSender!"); + if (m_serverAddress == null) { + throw new RuntimeException("No server address was configured for TcpSocketSender!"); } ChannelFactory factory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), @@ -80,17 +76,16 @@ public class TcpSocketSender extends Thread implements MessageSender, LogEnabled bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("keepAlive", true); - InetSocketAddress address = new InetSocketAddress(m_host, m_port); - ChannelFuture future = bootstrap.connect(address); + ChannelFuture future = bootstrap.connect(m_serverAddress); future.awaitUninterruptibly(); if (!future.isSuccess()) { - m_logger.error("Error when connecting to " + address, future.getCause()); + m_logger.error("Error when connecting to " + m_serverAddress, future.getCause()); } else { m_factory = factory; m_future = future; - m_logger.info("Connected to CAT server at " + address); + m_logger.info("Connected to CAT server at " + m_serverAddress); } m_bootstrap = bootstrap; @@ -108,16 +103,15 @@ public class TcpSocketSender extends Thread implements MessageSender, LogEnabled m_lastReconnectTime = now; - InetSocketAddress address = new InetSocketAddress(m_host, m_port); - ChannelFuture future = m_bootstrap.connect(address); + ChannelFuture future = m_bootstrap.connect(m_serverAddress); future.awaitUninterruptibly(); if (!future.isSuccess()) { - m_logger.error("Error when reconnecting to " + address, future.getCause()); + m_logger.error("Error when reconnecting to " + m_serverAddress, future.getCause()); } else { m_future = future; - m_logger.info("Reconnected to CAT server at " + address); + m_logger.info("Reconnected to CAT server at " + m_serverAddress); } } @@ -179,18 +173,14 @@ public class TcpSocketSender extends Thread implements MessageSender, LogEnabled m_codec = codec; } - public void setHost(String host) { - m_host = host; - } - - public void setPort(int port) { - m_port = port; - } - public void setReconnectPeriod(int reconnectPeriod) { m_reconnectPeriod = reconnectPeriod; } + public void setServerAddress(InetSocketAddress serverAddress) { + m_serverAddress = serverAddress; + } + @Override public void shutdown() { m_active = false; diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageHandler.java b/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageHandler.java index 7a0edc379d2163aa140dd5fdc5eb7735ee8b7a48..bb720eb32e191f96a58c12f6cdfadbcd4d4cfc69 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageHandler.java +++ b/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageHandler.java @@ -40,7 +40,7 @@ public class DefaultMessageHandler extends ContainerHolder implements MessageHan public void handle(MessageTree tree) { List consumers = m_registry.getConsumers(); int size = consumers.size(); - + for (int i = 0; i < size; i++) { MessageConsumer consumer = consumers.get(i); diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index a7802353dc8cb62c04a5243290e61433cbe4738e..a926b892dfb488962985db55239964c7361177bf 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -133,6 +133,27 @@ + + com.dianping.cat.message.io.MessageSender + tcp-socket-hierarchy + com.dianping.cat.message.io.TcpSocketHierarchySender + per-lookup + + + com.dianping.cat.message.spi.MessageStatistics + m_statistics + + + com.dianping.cat.message.spi.MessageCodec + plain-text + m_codec + + + com.dianping.cat.message.spi.MessageQueue + m_queue + + + com.dianping.cat.message.io.MessageReceiver tcp-socket diff --git a/cat-core/src/test/java/com/dianping/cat/message/io/TcpSocketHierarchyTest.java b/cat-core/src/test/java/com/dianping/cat/message/io/TcpSocketHierarchyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..eb945fadc9e99de4ea86368a0d3d9dc7879a7f2e --- /dev/null +++ b/cat-core/src/test/java/com/dianping/cat/message/io/TcpSocketHierarchyTest.java @@ -0,0 +1,102 @@ +package com.dianping.cat.message.io; + +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; + +import org.jboss.netty.bootstrap.ServerBootstrap; +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.channel.Channel; +import org.jboss.netty.channel.ChannelFactory; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.ChannelPipeline; +import org.jboss.netty.channel.ChannelPipelineFactory; +import org.jboss.netty.channel.Channels; +import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; +import org.jboss.netty.handler.codec.frame.FrameDecoder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import com.dianping.cat.message.spi.internal.DefaultMessageTree; +import com.site.lookup.ComponentTestCase; + +@RunWith(JUnit4.class) +public class TcpSocketHierarchyTest extends ComponentTestCase { + @Test + public void test() throws Exception { + TcpSocketHierarchySender sender = (TcpSocketHierarchySender) lookup(MessageSender.class, "tcp-socket-hierarchy"); + List addresses = getServerAddresses(); + StringBuilder result = new StringBuilder(); + ServerBootstrap bootstrap = createServerBootstrap(result); + List channels = new ArrayList(); + + for (InetSocketAddress address : addresses) { + Channel channel = bootstrap.bind(address); + + channels.add(channel); + } + + sender.setServerAddresses(addresses); + sender.initialize(); + + sender.send(new DefaultMessageTree()); + + Thread.sleep(100 * 1000); + } + + private ServerBootstrap createServerBootstrap(final StringBuilder result) { + ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), + Executors.newCachedThreadPool()); + ServerBootstrap bootstrap = new ServerBootstrap(factory); + + bootstrap.setPipelineFactory(new ChannelPipelineFactory() { + public ChannelPipeline getPipeline() { + return Channels.pipeline(new MockDecoder(result)); + } + }); + + bootstrap.setOption("child.tcpNoDelay", true); + bootstrap.setOption("child.keepAlive", true); + + return bootstrap; + } + + private List getServerAddresses() { + List list = new ArrayList(); + + for (int i = 0; i < 10; i++) { + list.add(new InetSocketAddress("localhost", 3000 + i)); + } + + return list; + } + + static class MockDecoder extends FrameDecoder { + private StringBuilder m_result; + + public MockDecoder(StringBuilder result) { + m_result = result; + } + + @Override + protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) { + if (buffer.readableBytes() < 4) { + return null; + } + + buffer.markReaderIndex(); + + int length = buffer.readInt(); + + if (buffer.readableBytes() < length) { + buffer.resetReaderIndex(); + return null; + } + + m_result.append('.'); + return buffer.readBytes(length); + } + } +} diff --git a/cat-home/dump/20120327/10/message-Cat-192.168.63.64 b/cat-home/dump/20120327/10/message-Cat-192.168.63.64 deleted file mode 100755 index 42841f24bbe9ad7589ec882c07538b755932dd49..0000000000000000000000000000000000000000 --- a/cat-home/dump/20120327/10/message-Cat-192.168.63.64 +++ /dev/null @@ -1,100 +0,0 @@ -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816447591-0 null null null -t2012-03-27 10:47:27.591 URL t -E2012-03-27 10:47:27.591 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/m/Cat-c0a83f40-1332816349195-0/logview.html?tag2=t:29&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:27.591 URL Payload 0 HTTP/GET /cat/r/t -A2012-03-27 10:47:27.591 MVC InboundPhase 0 0ms -A2012-03-27 10:47:27.591 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:27.591 MVC OutboundPhase -A2012-03-27 10:47:27.591 ModelService CompositeTransactionService 0 0ms request=ModelRequest[domain=Cat, period=CURRENT, properties={type=null, date=1332813600000}] -T2012-03-27 10:47:27.601 MVC OutboundPhase 0 10ms -T2012-03-27 10:47:27.601 URL t 0 10ms module=r&in=t&out=t - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816448574-0 null null null -t2012-03-27 10:47:28.574 URL p -E2012-03-27 10:47:28.574 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/t&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:28.574 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:28.574 MVC InboundPhase 0 1ms -A2012-03-27 10:47:28.575 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:28.575 MVC OutboundPhase -A2012-03-27 10:47:28.575 ModelService CompositeProblemService 0 0ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:28.586 MVC OutboundPhase 0 11ms -T2012-03-27 10:47:28.586 URL p 0 12ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816449411-0 null null null -t2012-03-27 10:47:29.411 URL p -E2012-03-27 10:47:29.411 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:29.411 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:29.411 MVC InboundPhase 0 0ms -A2012-03-27 10:47:29.411 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:29.411 MVC OutboundPhase -A2012-03-27 10:47:29.411 ModelService CompositeProblemService 0 2ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:29.425 MVC OutboundPhase 0 14ms -T2012-03-27 10:47:29.425 URL p 0 14ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816449836-0 null null null -t2012-03-27 10:47:29.836 URL p -E2012-03-27 10:47:29.836 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:29.836 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:29.836 MVC InboundPhase 0 0ms -A2012-03-27 10:47:29.836 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:29.836 MVC OutboundPhase -A2012-03-27 10:47:29.837 ModelService CompositeProblemService 0 0ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:29.850 MVC OutboundPhase 0 14ms -T2012-03-27 10:47:29.850 URL p 0 14ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816450052-0 null null null -t2012-03-27 10:47:30.052 URL p -E2012-03-27 10:47:30.052 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:30.052 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:30.052 MVC InboundPhase 0 0ms -A2012-03-27 10:47:30.052 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:30.052 MVC OutboundPhase -A2012-03-27 10:47:30.052 ModelService CompositeProblemService 0 1ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:30.064 MVC OutboundPhase 0 12ms -T2012-03-27 10:47:30.064 URL p 0 12ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816450284-0 null null null -t2012-03-27 10:47:30.284 URL p -E2012-03-27 10:47:30.284 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:30.284 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:30.284 MVC InboundPhase 0 0ms -A2012-03-27 10:47:30.284 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:30.284 MVC OutboundPhase -A2012-03-27 10:47:30.284 ModelService CompositeProblemService 0 0ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:30.292 MVC OutboundPhase 0 8ms -T2012-03-27 10:47:30.292 URL p 0 8ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816450601-0 null null null -t2012-03-27 10:47:30.601 URL p -E2012-03-27 10:47:30.601 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:30.601 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:30.601 MVC InboundPhase 0 1ms -A2012-03-27 10:47:30.602 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:30.602 MVC OutboundPhase -A2012-03-27 10:47:30.602 ModelService CompositeProblemService 0 0ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:30.619 MVC OutboundPhase 0 17ms -T2012-03-27 10:47:30.619 URL p 0 18ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816450790-0 null null null -t2012-03-27 10:47:30.790 URL p -E2012-03-27 10:47:30.790 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:30.790 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:30.790 MVC InboundPhase 0 0ms -A2012-03-27 10:47:30.790 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:30.790 MVC OutboundPhase -A2012-03-27 10:47:30.790 ModelService CompositeProblemService 0 1ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:30.799 MVC OutboundPhase 0 9ms -T2012-03-27 10:47:30.799 URL p 0 9ms module=r&in=p&out=p - -PT1 Cat FrankiematoMacBook-Air.local 192.168.63.64 main 38 btpool0-2 Cat-c0a83f40-1332816450977-0 null null null -t2012-03-27 10:47:30.977 URL p -E2012-03-27 10:47:30.977 URL ClientInfo 0 RemoteIP=fe80:0:0:0:0:0:0:1%1&Server=localhost&Referer=http://localhost:2281/cat/r/p&Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 -E2012-03-27 10:47:30.977 URL Payload 0 HTTP/GET /cat/r/p -A2012-03-27 10:47:30.977 MVC InboundPhase 0 1ms -A2012-03-27 10:47:30.978 MVC TransitionPhase 0 0ms -t2012-03-27 10:47:30.978 MVC OutboundPhase -A2012-03-27 10:47:30.979 ModelService CompositeProblemService 0 0ms request=ModelRequest[domain=Cat, period=CURRENT, properties={thread=192.168.63.64, date=1332813600000, ip=192.168.63.64}] -T2012-03-27 10:47:30.989 MVC OutboundPhase 0 11ms -T2012-03-27 10:47:30.989 URL p 0 12ms module=r&in=p&out=p - -PT1 Ca \ No newline at end of file diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java index feb78fed3ad390dc2b04a2d151b28a9932a31db3..640853175da1a48fe5f1585feb2f47c0a0a72cfe 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java @@ -164,18 +164,17 @@ public class Handler implements PageHandler, Initializable { private void showReport(Model model, Payload payload) { try { EventReport report = getReport(payload); - if (report == null) { - return; - } - + if (payload.getPeriod().isFuture()) { model.setLongDate(payload.getCurrentDate()); } else { model.setLongDate(payload.getDate()); } - report.accept(m_computer); - model.setReport(report); + if (report != null) { + report.accept(m_computer); + model.setReport(report); + } } catch (Throwable e) { Cat.getProducer().logError(e); model.setException(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java index ab6389a02a2a0e27f77cec21d5ad30ac9dc23260..0e048ee2a689a37908c80c612f9345f8358f157e 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java @@ -118,13 +118,15 @@ public class Handler implements PageHandler { model.setAllStatistics(new ProblemStatistics().displayAll(report, model)); break; case THREAD: - report = showSummary(model, payload); String groupName = payload.getGroupName(); + report = showSummary(model, payload); model.setGroupName(groupName); + if (report != null) { model.setThreadLevelInfo(new ThreadLevelInfo(model, groupName).display(report)); } + model.setAllStatistics(new ProblemStatistics().displayAll(report, model)); break; case DETAIL: @@ -162,24 +164,26 @@ public class Handler implements PageHandler { model.setLongDate(payload.getDate()); } - ProblemReport report = getReport(payload); - if (report == null) { - return null; - } - String ip = getIpAddress(report, payload); - if (period.isCurrent() || period.isFuture()) { Calendar cal = Calendar.getInstance(); int minute = cal.get(Calendar.MINUTE); - // model.setLastMinute(getLastMinute(report, ip)); + model.setLastMinute(minute); } else { model.setLastMinute(59); } model.setHour(getHour(model.getLongDate())); - model.setIpAddress(ip); - model.setReport(report); + + ProblemReport report = getReport(payload); + + if (report != null) { + String ip = getIpAddress(report, payload); + + model.setIpAddress(ip); + model.setReport(report); + } + return report; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java index 75ac24253a6c0b7855b1f97ffbccf34575217f11..faea6824cdbfe2dba6766d221e843c77acb418d0 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java @@ -106,11 +106,11 @@ public class Handler implements PageHandler, Initializable { HttpSession session = ctx.getHttpServletRequest().getSession(); String sessionDomain = (String) session.getAttribute("domain"); String sessionDate = (String) session.getAttribute("date"); - if (StringUtils.isEmpty(payload.getDomain())&&sessionDomain != null) { - payload.setDomain(sessionDomain); + if (StringUtils.isEmpty(payload.getDomain()) && sessionDomain != null) { + payload.setDomain(sessionDomain); } - if (payload.getRealDate() == 0&&sessionDate != null) { - payload.setDate(sessionDate); + if (payload.getRealDate() == 0 && sessionDate != null) { + payload.setDate(sessionDate); } model.setAction(payload.getAction()); @@ -173,8 +173,10 @@ public class Handler implements PageHandler, Initializable { model.setLongDate(payload.getDate()); } - report.accept(m_computer); - model.setReport(report); + if (report != null) { + report.accept(m_computer); + model.setReport(report); + } } catch (Throwable e) { Cat.getProducer().logError(e); model.setException(e); diff --git a/cat-home/src/main/resources/META-INF/cat/client.xml b/cat-home/src/main/resources/META-INF/cat/client.xml index edb6c6b186348f161b935db7c720f85434e0bf6f..d58703dbf5d9ba46ac5ca28dd74472d867cd7b66 100755 --- a/cat-home/src/main/resources/META-INF/cat/client.xml +++ b/cat-home/src/main/resources/META-INF/cat/client.xml @@ -2,5 +2,5 @@ - +