提交 7ae176f6 编写于 作者: S sunryuan

merge

......@@ -3,7 +3,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.dianping.cat</groupId>
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-client</artifactId>
......
......@@ -14,6 +14,7 @@ import org.unidal.initialization.Module;
import org.unidal.initialization.ModuleContext;
import com.dianping.cat.abtest.ABTestManager;
import com.dianping.cat.agent.MmapConsumerTask;
import com.dianping.cat.configuration.ClientConfigManager;
import com.dianping.cat.configuration.ClientConfigReloader;
import com.dianping.cat.configuration.client.entity.ClientConfig;
......@@ -48,8 +49,8 @@ public class CatClientModule extends AbstractModule {
// bring up TransportManager
ctx.lookup(TransportManager.class);
// start status update task
if (clientConfigManager.isCatEnabled()) {
// start status update task
StatusUpdateTask statusUpdateTask = ctx.lookup(StatusUpdateTask.class);
Threads.forGroup("Cat").start(statusUpdateTask);
......@@ -60,9 +61,12 @@ public class CatClientModule extends AbstractModule {
if (config != null) {
Threads.forGroup("Cat").start(new ClientConfigReloader(clientConfigFile.getAbsolutePath(), config));
}
}
ABTestManager.initialize();
MmapConsumerTask mmapReaderTask = ctx.lookup(MmapConsumerTask.class);
Threads.forGroup("Cat").start(mmapReaderTask);
ABTestManager.initialize();
}
}
@Override
......
package com.dianping.cat.agent;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ClientConfigManager;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.DefaultEvent;
import com.dianping.cat.message.internal.DefaultMessageManager;
import com.dianping.cat.message.internal.DefaultTransaction;
import com.dianping.cat.message.internal.MessageId;
import com.dianping.cat.message.spi.MessageTree;
import com.site.helper.Splitters;
public class MmapConsumerTask implements Task, Initializable, LogEnabled {
@Inject
private ClientConfigManager m_configManager;
@Inject
private DefaultMessageManager m_messageManager;
private QueueDescriptor m_descriptor;
private QueueReader m_reader;
private Logger m_logger;
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
@Override
public String getName() {
return getClass().getSimpleName();
}
public void initialize() {
String mmapName = m_configManager.getMmapName();
m_descriptor = new QueueDescriptor(new File(mmapName + ".idx"));
m_reader = new QueueReader(new File(mmapName + ".dat"));
}
@Override
public void run() {
Cat.setup(null);
try {
m_descriptor.ensureOpen(0, 24);
m_reader.ensureOpen(m_descriptor.getReaderIndex(), m_descriptor.getQueueSize());
while (true) {
MessageTree tree = m_reader.next();
if (tree == null) {
break;
}
m_messageManager.flush(tree);
}
} catch (InterruptedException e) {
// ignore it
} finally {
Cat.reset();
}
}
@Override
public void shutdown() {
}
class QueueDescriptor {
private File m_file;
private MappedByteBuffer m_buffer;
public QueueDescriptor(File file) {
m_file = file;
}
public void ensureOpen(long position, long size) throws InterruptedException {
boolean first = true;
while (true) {
if (m_file.canRead()) {
if (m_buffer == null && position < size) {
RandomAccessFile raf = null;
try {
if (first) {
m_logger.info(String.format("Opening mmap index file %s ...", m_file.getCanonicalPath()));
}
raf = new RandomAccessFile(m_file, "rw");
m_buffer = raf.getChannel().map(MapMode.READ_WRITE, 0, size);
m_buffer.load();
m_buffer.position((int) position);
m_buffer.order(ByteOrder.LITTLE_ENDIAN);
break;
} catch (IOException e) {
if (first) {
e.printStackTrace();
first = false;
}
} finally {
try {
raf.close(); // we don't need it any more
} catch (IOException e) {
// ignore it
}
}
}
}
TimeUnit.MILLISECONDS.sleep(100); // sleep 100ms
}
}
public long getQueueSize() {
return m_buffer.getLong(0);
}
public long getReaderIndex() {
return m_buffer.getLong(16);
}
public long getWriterIndex() {
return m_buffer.getLong(8);
}
public void setReaderIndex(long newIndex) {
m_buffer.putLong(16, newIndex);
}
@Override
public String toString() {
return String.format("%s[size=%s, writerIndex=%s, readerIndex=%s, file=%s]", getClass().getSimpleName(), getQueueSize(),
getWriterIndex(), getReaderIndex(), m_file);
}
}
class QueueReader {
private File m_file;
private MappedByteBuffer m_buffer;
public QueueReader(File file) {
m_file = file;
}
public void ensureOpen(long position, long size) throws InterruptedException {
boolean first = true;
while (true) {
if (m_file.canRead()) {
if (m_buffer == null) {
RandomAccessFile raf = null;
try {
if (first) {
m_logger.info(String.format("Opening mmap data file %s ...", m_file.getCanonicalPath()));
}
raf = new RandomAccessFile(m_file, "r");
m_buffer = raf.getChannel().map(MapMode.READ_ONLY, 0, size);
m_buffer.load();
m_buffer.position((int) position);
m_buffer.order(ByteOrder.LITTLE_ENDIAN);
break;
} catch (IOException e) {
if (first) {
e.printStackTrace();
first = false;
}
} finally {
try {
raf.close(); // we don't need it any more
} catch (IOException e) {
// ignore it
}
}
}
}
TimeUnit.MILLISECONDS.sleep(100); // sleep 100ms
}
}
private String getDomainByMessageId(String id, String defaultValue) {
try {
return MessageId.parse(id).getDomain();
} catch (RuntimeException e) {
return defaultValue;
}
}
private DefaultEvent newEvent(String type, String name, String data) {
DefaultEvent event = new DefaultEvent(type, name);
if (data != null) {
event.addData(data);
}
event.setStatus(Message.SUCCESS);
event.complete();
return event;
}
public MessageTree next() throws InterruptedException {
MessageTree tree = null;
List<String> list = new ArrayList<String>(16);
StringBuilder sb = new StringBuilder(1024);
String childId = null;
int step = 0;
while (true) {
sb.setLength(0);
readLine(sb);
if (sb.length() == 0) {
break;
}
String line = sb.toString();
list.clear();
Splitters.by('\t').split(line, list);
int size = list.size();
int index = 0;
switch (step) {
case 0:
if (size >= 3) {
String id = list.get(index++);
String parentId = list.get(index++);
String rootId = list.get(index++);
childId = id;
tree = m_messageManager.getThreadLocalMessageTree().copy();
tree.setMessageId(parentId);
tree.setParentMessageId(rootId);
tree.setRootMessageId(rootId);
tree.setDomain(getDomainByMessageId(id, tree.getDomain()));
step++;
}
break;
case 1:
if (size >= 13) {
String name = list.get(index++);
String status = list.get(index++);
String url = list.get(index++);
String requestHeaderLen = list.get(index++);
String upstreamUrl = list.get(index++);
String responseHeaderLen = list.get(index++);
String responseBodyLen = list.get(index++);
String responseBodyBlocks = list.get(index++);
long t0 = toLong(list.get(index++));
long t1 = toLong(list.get(index++));
long t2 = toLong(list.get(index++));
long t3 = toLong(list.get(index++));
long t4 = toLong(list.get(index++));
DefaultTransaction t = new DefaultTransaction(name, url, m_messageManager);
t.addChild(newEvent(name + ".Status", status, null));
t.addChild(newEvent("RemoteCall", upstreamUrl, childId));
t.addData("_m", (t1 - t0) + "," + (t2 - t1) + "," + (t3 - t2) + "," + (t4 - t3));
t.addData("in", requestHeaderLen);
t.addData("out", responseHeaderLen + "," + responseBodyLen);
t.addData("blocks", responseBodyBlocks);
t.addData("url", upstreamUrl);
if ("200".equals(status)) {
t.setStatus(Message.SUCCESS);
} else {
t.setStatus(status);
}
t.setDurationInMillis(t4 - t0);
t.setCompleted(true);
tree.setMessage(t);
step++;
}
break;
default:
// shouldn't go here
System.err.println("Unexpected line: " + line + ".");
break;
}
}
return tree;
}
private String readLine(StringBuilder sb) throws InterruptedException {
int size = m_buffer.limit();
long readerIndex = m_descriptor.getReaderIndex();
try {
while (true) {
long writerIndex = m_descriptor.getWriterIndex();
if (readerIndex == writerIndex) {
// buffer is empty
TimeUnit.MILLISECONDS.sleep(10);
continue;
}
if (readerIndex > writerIndex) {
while (readerIndex < size) {
byte b = m_buffer.get();
readerIndex++;
if (b == '\n') {
return sb.toString();
} else {
sb.append((char) (b & 0xFF));
}
}
readerIndex = 0;
m_buffer.rewind();
}
while (readerIndex < writerIndex) {
byte b = m_buffer.get();
readerIndex++;
if (b == '\n') {
return sb.toString();
} else {
sb.append((char) (b & 0xFF));
}
}
}
} finally {
m_descriptor.setReaderIndex(readerIndex);
}
}
private long toLong(String str) {
long value = 0;
int len = str == null ? 0 : str.length();
for (int i = 0; i < len; i++) {
char ch = str.charAt(i);
value = value * 10 + (ch - '0');
}
return value;
}
@Override
public String toString() {
return String.format("%s[file=%s]", getClass().getSimpleName(), m_file);
}
}
}
......@@ -8,6 +8,7 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.CatClientModule;
import com.dianping.cat.agent.MmapConsumerTask;
import com.dianping.cat.configuration.ClientConfigManager;
import com.dianping.cat.message.MessageProducer;
import com.dianping.cat.message.internal.DefaultMessageManager;
......@@ -26,6 +27,10 @@ import com.dianping.cat.message.spi.internal.DefaultMessageStatistics;
import com.dianping.cat.status.StatusUpdateTask;
public class ComponentsConfigurator extends AbstractResourceConfigurator {
public static void main(String[] args) {
generatePlexusComponentsXmlFile(new ComponentsConfigurator());
}
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
......@@ -53,6 +58,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(StatusUpdateTask.class) //
.req(MessageStatistics.class, ClientConfigManager.class));
all.add(C(MmapConsumerTask.class) //
.req(ClientConfigManager.class, MessageManager.class));
all.add(C(Module.class, CatClientModule.ID, CatClientModule.class));
all.addAll(new CodecComponentConfigurator().defineComponents());
......@@ -60,8 +68,4 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
return all;
}
public static void main(String[] args) {
generatePlexusComponentsXmlFile(new ComponentsConfigurator());
}
}
......@@ -13,6 +13,7 @@ import org.unidal.helper.Files;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.client.entity.ClientConfig;
import com.dianping.cat.configuration.client.entity.Domain;
import com.dianping.cat.configuration.client.entity.Property;
import com.dianping.cat.configuration.client.entity.Server;
import com.dianping.cat.configuration.client.transform.DefaultSaxParser;
......@@ -56,6 +57,38 @@ public class ClientConfigManager implements LogEnabled {
}
}
/**
* Return the max total message node size for the whole message, children after this limit will be split into another child
* message tree.
*
* @return
*/
public int getMaxMessageLength() {
if (m_config == null) {
return 1000;
} else {
return getDomain().getMaxMessageSize();
}
}
public String getMmapName() {
return getPropertyValue("mmap-name", "/data/appdatas/cat/mmap");
}
private String getPropertyValue(String name, String defaultValue) {
String value = defaultValue;
if (m_config != null) {
Property property = m_config.getProperties().get(name);
if (property != null) {
value = property.getText();
}
}
return value;
}
public List<Server> getServers() {
if (m_config == null) {
return Collections.emptyList();
......@@ -133,18 +166,4 @@ public class ClientConfigManager implements LogEnabled {
public boolean isInitialized() {
return m_config != null;
}
/**
* Return the max total message node size for the whole message, children after this limit will be split into another child
* message tree.
*
* @return
*/
public int getMaxMessageLength() {
if (m_config == null) {
return 1000;
} else {
return getDomain().getMaxMessageSize();
}
}
}
......@@ -99,7 +99,7 @@ public abstract class AbstractMessage implements Message {
return Message.SUCCESS.equals(m_status);
}
protected void setCompleted(boolean completed) {
public void setCompleted(boolean completed) {
m_completed = completed;
}
......
......@@ -76,7 +76,7 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan
}
}
void flush(MessageTree tree) {
public void flush(MessageTree tree) {
MessageSender sender = m_transportManager.getSender();
if (sender != null && !shouldThrottle(tree)) {
......
......@@ -47,7 +47,7 @@ public class MessageIdFactory {
index = m_index++;
saveMark();
}
StringBuilder sb = new StringBuilder(m_domain.length() + 32);
sb.append(m_domain);
......@@ -92,6 +92,8 @@ public class MessageIdFactory {
String tmpDir = System.getProperty("java.io.tmpdir");
File mark = new File(tmpDir, "cat-" + domain + ".mark");
System.out.println("Message id mark file: " + mark.getCanonicalPath());
m_markFile = new RandomAccessFile(mark, "rw");
m_byteBuffer = m_markFile.getChannel().map(MapMode.READ_WRITE, 0, 20);
......
......@@ -47,20 +47,20 @@ public abstract class MockMessageBuilder {
return e;
}
protected MetricHolder m(String type, String name) {
MetricHolder e = new MetricHolder(type, name);
protected HeartbeatHolder h(String type, String name) {
HeartbeatHolder h = new HeartbeatHolder(type, name);
TransactionHolder parent = m_stack.isEmpty() ? null : m_stack.peek();
if (parent != null) {
e.setTimestampInMicros(parent.getCurrentTimestampInMicros());
h.setTimestampInMicros(parent.getCurrentTimestampInMicros());
}
return e;
return h;
}
protected MetricHolder m(String type, String name, String data) {
MetricHolder e = new MetricHolder(type, name, data);
protected MetricHolder m(String type, String name) {
MetricHolder e = new MetricHolder(type, name);
TransactionHolder parent = m_stack.isEmpty() ? null : m_stack.peek();
......@@ -71,16 +71,16 @@ public abstract class MockMessageBuilder {
return e;
}
protected HeartbeatHolder h(String type, String name) {
HeartbeatHolder h = new HeartbeatHolder(type, name);
protected MetricHolder m(String type, String name, String data) {
MetricHolder e = new MetricHolder(type, name, data);
TransactionHolder parent = m_stack.isEmpty() ? null : m_stack.peek();
if (parent != null) {
h.setTimestampInMicros(parent.getCurrentTimestampInMicros());
e.setTimestampInMicros(parent.getCurrentTimestampInMicros());
}
return h;
return e;
}
protected TransactionHolder t(String type, String name, long durationInMillis) {
......@@ -94,9 +94,9 @@ public abstract class MockMessageBuilder {
m_stack.push(t);
return t;
}
protected TransactionHolder t(String type, String name,String data, long durationInMillis) {
TransactionHolder t = new TransactionHolder(type, name,data, durationInMillis);
protected TransactionHolder t(String type, String name, String data, long durationInMillis) {
TransactionHolder t = new TransactionHolder(type, name, data, durationInMillis);
TransactionHolder parent = m_stack.isEmpty() ? null : m_stack.peek();
if (parent != null) {
......@@ -129,6 +129,18 @@ public abstract class MockMessageBuilder {
m_data = data;
}
public void addData(String key, String value) {
if (m_data == null) {
m_data = key + "=" + value;
} else {
m_data = m_data + "&" + key + "=" + value;
}
}
public String getData() {
return m_data;
}
public String getName() {
return m_name;
}
......@@ -154,10 +166,6 @@ public abstract class MockMessageBuilder {
m_status = status;
}
public String getData() {
return m_data;
}
@Override
public void setTimestampInMicros(long timestampInMicros) {
m_timestampInMicros = timestampInMicros;
......@@ -192,34 +200,6 @@ public abstract class MockMessageBuilder {
}
}
protected static class MetricHolder extends AbstractMessageHolder {
private DefaultMetric m_metric;
public MetricHolder(String type, String name) {
super(type, name);
}
public MetricHolder(String type, String name, String data) {
super(type, name, data);
}
@Override
public Metric build() {
m_metric = new DefaultMetric(getType(), getName());
m_metric.setTimestamp(getTimestampInMillis());
m_metric.setStatus(getStatus());
m_metric.addData(getData());
m_metric.complete();
return m_metric;
}
public MetricHolder status(String status) {
setStatus(status);
return this;
}
}
protected static class HeartbeatHolder extends AbstractMessageHolder {
private DefaultHeartbeat m_heartbeat;
......@@ -250,6 +230,34 @@ public abstract class MockMessageBuilder {
public void setTimestampInMicros(long timestampInMicros);
}
protected static class MetricHolder extends AbstractMessageHolder {
private DefaultMetric m_metric;
public MetricHolder(String type, String name) {
super(type, name);
}
public MetricHolder(String type, String name, String data) {
super(type, name, data);
}
@Override
public Metric build() {
m_metric = new DefaultMetric(getType(), getName());
m_metric.setTimestamp(getTimestampInMillis());
m_metric.setStatus(getStatus());
m_metric.addData(getData());
m_metric.complete();
return m_metric;
}
public MetricHolder status(String status) {
setStatus(status);
return this;
}
}
protected class TransactionHolder extends AbstractMessageHolder {
private long m_durationInMicros;
......@@ -266,14 +274,13 @@ public abstract class MockMessageBuilder {
m_durationInMicros = durationInMicros;
}
public TransactionHolder(String type, String name,String data, long durationInMicros) {
super(type, name,data);
public TransactionHolder(String type, String name, String data, long durationInMicros) {
super(type, name, data);
m_durationInMicros = durationInMicros;
}
public TransactionHolder after(long periodInMicros) {
m_currentTimestampInMicros += periodInMicros;
return this;
......@@ -311,6 +318,11 @@ public abstract class MockMessageBuilder {
return this;
}
public TransactionHolder data(String key, String value) {
addData(key, value);
return this;
}
public long getCurrentTimestampInMicros() {
return m_currentTimestampInMicros;
}
......
......@@ -94,6 +94,18 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.agent.MmapConsumerTask</role>
<implementation>com.dianping.cat.agent.MmapConsumerTask</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.configuration.ClientConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageManager</role>
</requirement>
</requirements>
</component>
<component>
<role>org.unidal.initialization.Module</role>
<role-hint>cat-client</role-hint>
......
package com.dianping.cat.agent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.message.internal.MessageIdFactory;
public class MmapConsumerTaskTest extends ComponentTestCase {
private void createMessage(MessageIdFactory factory, StringBuilder sb, int i) {
String status = (i % 7 == 0) || (i % 11 == 0) ? "50" + (i % 3) : "200";
long t0 = System.currentTimeMillis();
// <id>\t<parent-id>\t<root-id>\n
sb.append(String.format("%s\t%s\t%s\n", factory.getNextId(), factory.getNextId(), factory.getNextId()));
// <name>\t<status>\t<url>\t<request-header-len>\t<upstream-url>\t<response-header-len>\t<response-body-len>\t<response-body-blocks>\t<t0>\t<t1>\t<t2>\t<3>\t<t4>\n
sb.append(String.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", //
"NginxTest", status, "http://url/here/" + i, i % 10, "http://upstream/url/here/" + (i % 3), //
i % 9, i % 8, i % 7, t0, t0 + i, t0 + 3 * i, t0 + 4 * i, t0 + 5 * i));
// \n
sb.append("\n");
}
@Test
public void generateDataFile() throws Exception {
File idx = new File("/data/appdatas/cat/mmap.idx");
File dat = new File("/data/appdatas/cat/mmap.dat");
MessageIdFactory factory = lookup(MessageIdFactory.class);
StringBuilder sb = new StringBuilder(8192);
factory.initialize("Cat");
for (int i = 0; i < 100; i++) {
createMessage(factory, sb, i);
}
FileWriter datWriter = new FileWriter(dat);
datWriter.write(sb.toString());
datWriter.close();
updateMmapIndex(idx, dat.length(), dat.length(), 0);
}
private void updateMmapIndex(File idx, long capacity, long writerIndex, long readerIndex) throws FileNotFoundException,
IOException {
RandomAccessFile raf = new RandomAccessFile(idx, "rw");
MappedByteBuffer buffer = raf.getChannel().map(MapMode.READ_WRITE, 0, 24);
buffer.order(ByteOrder.LITTLE_ENDIAN);
if (capacity > 0) {
buffer.putLong(0, capacity);
}
if (writerIndex >= 0) {
buffer.putLong(8, writerIndex);
}
if (readerIndex >= 0) {
buffer.putLong(16, readerIndex);
}
buffer.force();
raf.close();
}
@Test
public void updateWriterIndex() throws Exception {
File idx = new File("/data/appdatas/cat/mmap.idx");
MessageIdFactory factory = lookup(MessageIdFactory.class);
StringBuilder sb = new StringBuilder(8192);
factory.initialize("Cat");
for (int i = 0; i < 50; i++) {
createMessage(factory, sb, i);
}
updateMmapIndex(idx, -1, sb.length(), -1);
}
}
......@@ -3,7 +3,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-consumer-advanced</artifactId>
......
......@@ -174,6 +174,8 @@ public class MetricConfigManager implements Initializable, LogEnabled {
config.setName(CONFIG_NAME);
config.setContent(getMetricConfig().toString());
m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
System.out.println(config.getContent());
} catch (Exception e) {
Cat.logError(e);
return false;
......
......@@ -92,11 +92,11 @@ public class MatrixAnalyzer extends AbstractMessageAnalyzer<MatrixReport> implem
}
if (real.getMax() < count) {
real.setMax(count);
real.setUrl(tree.getMessageId());
}
real.setTotalCount(real.getTotalCount() + count);
real.setTotalTime(real.getTotalTime() + time);
}
// the message is required by some matrixs
if (matrix.getUrl() == null) {
matrix.setUrl(tree.getMessageId());
}
......
......@@ -28,6 +28,8 @@ public class MatrixDelegate implements ReportDelegate<MatrixReport> {
domainNames.clear();
domainNames.addAll(reports.keySet());
new MatrixReportFilter().visitMatrixReport(report);
}
}
......
......@@ -25,6 +25,7 @@ public class MatrixReportMerger extends DefaultMerger {
@Override
protected void mergeRatio(Ratio old, Ratio ratio) {
old.setUrl(ratio.getUrl());
old.setTotalCount(old.getTotalCount() + ratio.getTotalCount());
old.setTotalTime(old.getTotalTime() + ratio.getTotalTime());
if (old.getMin() == 0) {
......
......@@ -13,12 +13,14 @@
<attribute name="name" value-type="String" key="true"/>
<attribute name="count" value-type="int" primitive="true"/>
<attribute name="totalTime" value-type="long" primitive="true"/>
<attribute name="url" value-type="String" />
<entity-ref name="ratio" type="map" names="ratios" method-find-or-create="true"/>
</entity>
<entity name="ratio">
<attribute name="type" value-type="String" key="true"/>
<attribute name="min" value-type="int" primitive="true"/>
<attribute name="max" value-type="int" primitive="true"/>
<attribute name="url" value-type="String" />
<attribute name="totalCount" value-type="int" primitive="true"/>
<attribute name="totalTime" value-type="long" primitive="true"/>
</entity>
......
......@@ -13,5 +13,8 @@
<attribute name="show-count" value-type="boolean" primitive="true"/>
<attribute name="show-avg" value-type="boolean" primitive="true"/>
<attribute name="show-sum" value-type="boolean" primitive="true"/>
<attribute name="show-count-dashboard" value-type="boolean" primitive="true"/>
<attribute name="show-avg-dashboard" value-type="boolean" primitive="true"/>
<attribute name="show-sum-dashboard" value-type="boolean" primitive="true"/>
</entity>
</model>
\ No newline at end of file
......@@ -3,7 +3,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-consumer</artifactId>
......
......@@ -209,6 +209,18 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
if (ipInfo == null) {
m_domainManager.insert(domain, ip);
} else if (!ipInfo.getIp().equals(ip)) {
String localIp = NetworkInterfaceManager.INSTANCE.getLocalHostAddress();
// only work on online enviroment
if (localIp.startsWith("10.")) {
long current = System.currentTimeMillis();
long lastModifyTime = ipInfo.getLastModifiedDate().getTime();
if (current - lastModifyTime > ONE_HOUR) {
m_domainManager.update(ipInfo.getId(), domain, ip);
m_logger.info(String.format("change ip %s to domain %", ipInfo.getIp(), domain));
}
}
}
}
}
......
......@@ -31,6 +31,7 @@ public class StateDelegate implements ReportDelegate<StateReport> {
@Override
public boolean createHourlyTask(StateReport report) {
m_taskManager.createTask(report.getStartTime(), report.getDomain(), "service", TaskProlicy.ALL);
m_taskManager.createTask(report.getStartTime(), report.getDomain(), "bug", TaskProlicy.ALL);
return m_taskManager.createTask(report.getStartTime(), report.getDomain(), StateAnalyzer.ID, TaskProlicy.ALL_EXCLUED_HOURLY);
}
......
......@@ -62,14 +62,14 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
topReport.setStartTime(new Date(m_startTime));
topReport.setEndTime(new Date(m_startTime + 60 * MINUTE - 1));
for (String domainName : domains) {
if (validateDomain(domainName)) {
if (validate(domainName)) {
TransactionReport report = m_transactionAnalyzer.getReport(domainName);
new TransactionReportVisitor(topReport).visitTransactionReport(report);
}
}
for (String domainName : domains) {
if (validateDomain(domainName)) {
if (validate(domainName)) {
ProblemReport report = m_problemAnalyzer.getReport(domainName);
new ProblemReportVisitor(topReport).visitProblemReport(report);
......@@ -91,11 +91,7 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
m_transactionAnalyzer = transactionAnalyzer;
}
private boolean validateDomain(String domain) {
return !domain.equals(ReportConstants.FRONT_END) && !domain.equals(ReportConstants.ALL);
}
static class ProblemReportVisitor extends com.dianping.cat.consumer.problem.model.transform.BaseVisitor {
public static class ProblemReportVisitor extends com.dianping.cat.consumer.problem.model.transform.BaseVisitor {
private String m_domain;
private String m_type;
......
......@@ -49,8 +49,6 @@ public class TransactionReportMerger extends DefaultMerger {
old.setSum(old.getSum() + other.getSum());
old.setSum2(old.getSum2() + other.getSum2());
if (old.getTotalCount() > 0) {
old.setFailPercent(old.getFailCount() * 100.0 / old.getTotalCount());
old.setAvg(old.getSum() / old.getTotalCount());
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-core</artifactId>
......
......@@ -3,6 +3,7 @@ package com.dianping.cat;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
......@@ -123,7 +124,6 @@ public class DomainManager implements Initializable, LogEnabled {
} catch (DalException e) {
Cat.logError(e);
}
Threads.forGroup("Cat").start(new ReloadDomainTask());
}
}
......@@ -250,6 +250,7 @@ public class DomainManager implements Initializable, LogEnabled {
info.setId(id);
info.setDomain(domain);
info.setIp(ip);
info.setLastModifiedDate(new Date());
m_hostInfoDao.updateByPK(info, HostinfoEntity.UPDATESET_FULL);
m_domainsInCat.add(domain);
m_ipsInCat.put(ip, info);
......
......@@ -158,6 +158,5 @@ public abstract class AbstractMessageAnalyzer<R> extends ContainerHolder impleme
public boolean validate(String domain) {
return !domain.equals("PhoenixAgent") && !domain.equals(ReportConstants.FRONT_END);
}
}
......@@ -17,6 +17,7 @@ import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageCodec;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.message.spi.codec.BufferWriter;
import com.site.helper.Splitters;
/**
* Local use only, do not use it over network since it only supports one-way encoding
......@@ -24,21 +25,27 @@ import com.dianping.cat.message.spi.codec.BufferWriter;
public class WaterfallMessageCodec implements MessageCodec, Initializable {
public static final String ID = "waterfall";
private static final String VERSION = "WF1"; // Waterfall version 1
private static final String VERSION = "WF2"; // Waterfall version 2
@Inject
private BufferWriter m_writer;
private BufferHelper m_bufferHelper;
private String[] m_colors = { "#0066ff", "#006699", "#006633", "#0033ff", "#003399", "#003333" };
private boolean m_mockMode = false;
protected int countTransactions(Transaction t) {
protected int calculateLines(Transaction t) {
int count = 1;
for (Message child : t.getChildren()) {
if (child instanceof Transaction) {
count += countTransactions((Transaction) child);
count += calculateLines((Transaction) child);
} else if (child instanceof Event) {
if (child.getType().equals("RemoteCall")) {
count++;
}
}
}
......@@ -73,7 +80,7 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
Ruler ruler = new Ruler((int) t.getDurationInMicros());
ruler.setWidth(1400);
ruler.setHeight(18 * countTransactions(t) + 10);
ruler.setHeight(18 * calculateLines(t) + 10);
ruler.setOffsetX(200);
ruler.setOffsetY(10);
......@@ -154,7 +161,6 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
String logviewId = String.valueOf(event.getData());
b.branch(locator, x, y, width, height);
x += locator.getLevel() * width;
b.tagWithText("text", "<a href='#'>[:: show ::]</a>", "x", x + 2, "y", y - 5, "font-size", "16", "stroke-width", "0", "fill",
"blue", "onclick", "popup('" + logviewId + "');");
......@@ -213,8 +219,9 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
for (int i = 0; i < len; i++) {
Message child = children.get(i);
locator.setLast(i == len - 1);
if (child instanceof Transaction) {
locator.setLast(i == len - 1);
count += encodeTransaction(tree, (Transaction) child, buf, locator, ruler);
} else if (child instanceof Event && "RemoteCall".equals(child.getType())) {
count += encodeRemoteCall(tree, (Event) child, buf, locator, ruler);
......@@ -228,16 +235,18 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
protected int encodeTransactionLine(MessageTree tree, Transaction t, ChannelBuffer buf, Locator locator, Ruler ruler) {
BufferHelper helper = m_bufferHelper;
XmlBuilder b = new XmlBuilder();
StringBuilder sb = b.getResult();
int width = 6;
int height = 18;
int x = 0;
int y = locator.getLine() * height + ruler.getOffsetY();
String rid = "r" + locator.getLine();
String tid = "t" + locator.getLine();
long t0 = tree.getMessage().getTimestamp();
long t1 = t.getTimestamp();
int rx = ruler.calcX((t1 - t0) * 1000);
int rw = ruler.calcWidth(t.getDurationInMicros() * 1000);
int[] segments = getTransactionDurationSegments(t);
b.branch(locator, x, y, width, height);
x += locator.getLevel() * width;
if (t.getStatus().equals("0")) {
......@@ -247,25 +256,95 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
}
b.add(t.getType()).newLine();
b.tag("set", "attributeName", "fill", "to", "red", "begin", rid + ".mouseover", "end", rid + ".mouseout");
b.tag("set", "attributeName", "fill", "to", "red", "begin", tid + ".mouseover", "end", tid + ".mouseout");
b.tag2("text");
long t0 = tree.getMessage().getTimestamp();
long t1 = t.getTimestamp();
long d = t.getDurationInMicros();
if (segments == null) {
String durationInMillis = String.format("%.2f %s", t.getDurationInMicros() / 1000.0, t.getName());
int rx = ruler.calcX((t1 - t0) * 1000);
int rw = ruler.calcX(d) - ruler.getOffsetX();
b.tag("rect", "x", rx + 1, "y", y - 15, "width", rw, "height", height - 2, "fill", "#0066ff", "opacity", "0.5");
b.tagWithText("text", durationInMillis, "x", rx + 5, "y", y - 3, "font-size", "11", "stroke-width", "0");
} else {
int index = 0;
b.tag("rect", "id", rid, "x", rx + 1, "y", y - 15, "width", rw, "height", height - 2, "fill", "#0066ff", "opacity", "0.5");
b.tagWithText("text", String.format("%.2f %s", t.getDurationInMicros() / 1000.0, t.getName()), "id", tid, "x", rx + 5, "y",
y - 3, "font-size", "11", "stroke-width", "0");
for (int segment : segments) {
int w = ruler.calcWidth(segment);
String durationInMillis = String.format("%.2f %s", segment / 1000.0 / 1000.0, index == 0 ? t.getName() : "");
String color = m_colors[index % m_colors.length];
int count = helper.write(buf, sb.toString());
b.tag("rect", "x", rx + 1, "y", y - 15, "width", w, "height", height - 2, "fill", color, "opacity", "0.5");
b.tagWithText("text", durationInMillis, "x", rx + 5, "y", y - 3, "font-size", "11", "stroke-width", "0");
index++;
rx += w;
}
}
b.tag("rect", "id", tid, "x", ruler.getOffsetX() + 1, "y", y - 15, "width", ruler.getWidth(), "height", height, "fill",
"#ffffff", "stroke-width", "0", "opacity", "0.01");
int count = helper.write(buf, b.getResult().toString());
return count;
}
private int[] getTransactionDurationSegments(Transaction t) {
String data = t.getData().toString();
if (data.startsWith("_m=")) {
int pos = data.indexOf('&');
String str;
if (pos < 0) {
str = data.substring(3);
} else {
str = data.substring(3, pos);
}
List<String> parts = Splitters.by(',').split(str);
int len = parts.size();
int[] segments = new int[len];
for (int i = 0; i < len; i++) {
String part = parts.get(i);
try {
segments[i] = Integer.parseInt(part) * 1000;
} catch (Exception e) {
// ignore it
}
}
return segments;
} else if (data.startsWith("_u=")) {
int pos = data.indexOf('&');
String str;
if (pos < 0) {
str = data.substring(3);
} else {
str = data.substring(3, pos);
}
List<String> parts = Splitters.by(',').split(str);
int len = parts.size();
int[] segments = new int[len];
for (int i = 0; i < len; i++) {
String part = parts.get(i);
try {
segments[i] = Integer.parseInt(part);
} catch (Exception e) {
// ignore it
}
}
return segments;
} else {
return null;
}
}
protected List<Message> getVisibleChildren(Transaction parent) {
List<Message> children = new ArrayList<Message>();
......@@ -280,6 +359,10 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
return children;
}
public boolean isMockMode() {
return m_mockMode;
}
@Override
public void initialize() throws InitializationException {
m_bufferHelper = new BufferHelper(m_writer);
......@@ -300,9 +383,9 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
.mark().after(200).child(t("MEMCACHED", "Inc", 319)) //
.reset().after(500).child(t("BIG ASS SERVICE", "getThemDatar", 97155) //
.after(1000).mark().child(t("SERVICE", "getStuff", 63760)) //
.child(e("RemoteCall", "mock", "mock-message-id")) //
.reset().child(t("DATAR", "findThings", 94537)) //
.reset().child(t("DATAR", "findThings", 94537).data("_m", "10000,30000,15000,39537")) //
.after(200).child(t("THINGIE", "getMoar", 1435)) //
.child(e("RemoteCall", "mock", "mock-message-id")) //
) //
.after(100).mark().child(t("OTHER DATA SERVICE", "get", 4394) //
.after(800).mark().child(t("MEMCACHED", "Get", 378)) //
......@@ -311,7 +394,7 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
.reset().child(t("FINAL DATA SERVICE", "get", 1902) //
.after(1000).mark().child(t("MEMCACHED", "Get", 386)) //
.reset().child(t("MEMCACHED", "Get", 322)) //
.reset().child(t("MEMCACHED", "Get", 322)) //
.reset().child(t("MEMCACHED", "Get", 542)) //
) //
) //
;
......@@ -674,16 +757,26 @@ public class WaterfallMessageCodec implements MessageCodec, Initializable {
}
}
public int calcX(long value) {
int w = (int) (value * getUnit() / m_unitStep);
public int calcX(long timeInMillis) {
int w = (int) (timeInMillis * getUnit() / m_unitStep);
if (w == 0 && value > 0) {
if (w == 0 && timeInMillis > 0) {
w = 1;
}
return w + m_offsetX;
}
public int calcWidth(long timeInMicros) {
int w = (int) (timeInMicros * getUnit() / m_unitStep / 1000);
if (w == 0 && timeInMicros > 0) {
w = 1;
}
return w;
}
public int getHeight() {
return m_height;
}
......
......@@ -5,6 +5,7 @@ import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import com.dianping.cat.message.spi.core.HtmlMessageCodecTest;
import com.dianping.cat.message.spi.core.WaterfallMessageCodecTest;
import com.dianping.cat.storage.dump.LocalMessageBucketManagerTest;
import com.dianping.cat.storage.dump.LocalMessageBucketTest;
import com.dianping.cat.storage.report.LocalReportBucketTest;
......@@ -15,14 +16,17 @@ import com.dianping.cat.task.TaskManagerTest;
HtmlMessageCodecTest.class,
/* .storage */
LocalReportBucketTest.class,
WaterfallMessageCodecTest.class,
/* .storage.dump */
LocalMessageBucketTest.class,
LocalMessageBucketManagerTest.class,
/* .storage.report */
LocalReportBucketTest.class,
/* .task */
TaskManagerTest.class
})
......
......@@ -3,10 +3,19 @@ package com.dianping.cat.message.spi.core;
import junit.framework.Assert;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.message.spi.MessageCodec;
import com.dianping.cat.message.spi.core.WaterfallMessageCodec.Ruler;
public class WaterfallMessageCodecTest {
public class WaterfallMessageCodecTest extends ComponentTestCase {
@Test
public void testNotMockMode() throws Exception {
WaterfallMessageCodec codec = (WaterfallMessageCodec) lookup(MessageCodec.class, WaterfallMessageCodec.ID);
Assert.assertEquals("WaterfallMessageCodec is in mock mode.", false, codec.isMockMode());
}
@Test
public void testRuler() {
checkRuler(0, 0, 1);
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-hadoop</artifactId>
......
......@@ -3,7 +3,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.2</version>
<version>0.6.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-home</artifactId>
......@@ -186,7 +186,10 @@
${basedir}/src/main/resources/META-INF/dal/model/exception-threshold-config-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/threshold-template-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/bug-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/bug-config-manifest.xml,</manifest>
${basedir}/src/main/resources/META-INF/dal/model/bug-config-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/service-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/heavy-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/utilization-report-manifest.xml,</manifest>
</configuration>
</execution>
<execution>
......
......@@ -6,6 +6,7 @@ import java.util.List;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.DomainManager;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
......@@ -38,6 +39,7 @@ import com.dianping.cat.report.task.metric.MetricPointParser;
import com.dianping.cat.report.task.problem.ProblemGraphCreator;
import com.dianping.cat.report.task.problem.ProblemMerger;
import com.dianping.cat.report.task.problem.ProblemReportBuilder;
import com.dianping.cat.report.task.service.ServiceReportBuilder;
import com.dianping.cat.report.task.spi.ReportFacade;
import com.dianping.cat.report.task.sql.SqlMerger;
import com.dianping.cat.report.task.sql.SqlReportBuilder;
......@@ -94,8 +96,9 @@ public class TaskComponentConfigurator extends AbstractResourceConfigurator {
.req(GraphDao.class, ReportService.class) //
.req(HeartbeatGraphCreator.class));
all.add(C(BugReportBuilder.class)
.req( ReportService.class));
all.add(C(BugReportBuilder.class).req(ReportService.class));
all.add(C(ServiceReportBuilder.class).req(ReportService.class, DomainManager.class));
all.add(C(MatrixReportBuilder.class).req(ReportService.class));
......@@ -111,10 +114,10 @@ public class TaskComponentConfigurator extends AbstractResourceConfigurator {
TopologyGraphDao.class));
all.add(C(ReportFacade.class)//
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class //
, HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class //
, SqlReportBuilder.class, StateReportBuilder.class, DependencyReportBuilder.class,BugReportBuilder.class,
MetricBaselineReportBuilder.class));
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class,
HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class,
SqlReportBuilder.class, StateReportBuilder.class, DependencyReportBuilder.class,
BugReportBuilder.class, ServiceReportBuilder.class, MetricBaselineReportBuilder.class));
return all;
}
......
......@@ -41,7 +41,7 @@ public enum ReportPage implements Page {
EXTERNALERROR("externalError", "externalError", "externalError", "ExternalError", true),
BUG("bug", "bug", "Bug", "Bug", true);
BUG("bug", "bug", "Statistics", "Bug", true);
private String m_name;
......
package com.dianping.cat.report.page.bug;
public enum Action implements org.unidal.web.mvc.Action {
HISTORY_REPORT("history"),
HOURLY_REPORT("view"),
HTTP_JSON("json")
;
private String m_name;
private Action(String name) {
m_name = name;
}
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
if (action.getName().equals(name)) {
return action;
}
}
return defaultAction;
}
@Override
public String getName() {
return m_name;
}
}
package com.dianping.cat.report.page.bug;
public enum Action implements org.unidal.web.mvc.Action {
HISTORY_REPORT("historyBug"),
HOURLY_REPORT("view"),
HTTP_JSON("json"),
SERVICE_REPORT("service"),
SERVICE_HISTORY_REPORT("historyService");
private String m_name;
private Action(String name) {
m_name = name;
}
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
if (action.getName().equals(name)) {
return action;
}
}
return defaultAction;
}
@Override
public String getName() {
return m_name;
}
}
package com.dianping.cat.report.page.bug;
import com.dianping.cat.report.ReportContext;
public class Context extends ReportContext<Payload> {
}
package com.dianping.cat.report.page.bug;
import com.dianping.cat.report.ReportContext;
public class Context extends ReportContext<Payload> {
}
package com.dianping.cat.report.page.bug;
import java.io.IOException;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import org.unidal.lookup.annotation.Inject;
import org.unidal.web.mvc.PageHandler;
import org.unidal.web.mvc.annotation.InboundActionMeta;
import org.unidal.web.mvc.annotation.OutboundActionMeta;
import org.unidal.web.mvc.annotation.PayloadMeta;
import com.dianping.cat.core.dal.Project;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.MapUtils;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.bug.entity.Domain;
import com.dianping.cat.home.bug.entity.ExceptionItem;
import com.dianping.cat.home.bug.transform.BaseVisitor;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.system.config.BugConfigManager;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject
private ReportService m_reportService;
@Inject
private DomainNavManager m_domainManager;
@Inject
private BugConfigManager m_bugConfigManager;
@Inject
private PayloadNormalizer m_normalizePayload;
public Project findByDomain(String domain) {
return m_domainManager.getProjectByName(domain);
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "bug")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "bug")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
m_normalizePayload.normalize(model, payload);
BugReport bugReport = queryBugReport(payload);
BugReportVisitor visitor = new BugReportVisitor();
visitor.visitBugReport(bugReport);
Map<String, ErrorStatis> errors = visitor.getErrors();
errors = sortErrorStatis(errors);
model.setErrorStatis(errors);
if (payload.getAction() == Action.HTTP_JSON) {
new ClearBugReport().visitBugReport(bugReport);
}
model.setBugReport(bugReport);
model.setPage(ReportPage.BUG);
m_jspViewer.view(ctx, model);
}
private boolean isBug(String domain, String exception) {
Set<String> bugConfig = m_bugConfigManager.queryBugConfigsByDomain(domain);
return !bugConfig.contains(exception);
}
private BugReport queryBugReport(Payload payload) {
Date start = null;
Date end = null;
if (payload.getAction() == Action.HOURLY_REPORT) {
if (payload.getPeriod().isCurrent()) {
start = new Date(payload.getDate() - TimeUtil.ONE_HOUR);
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
} else {
start = new Date(payload.getDate());
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
}
} else {
start = payload.getHistoryStartDate();
end = payload.getHistoryEndDate();
}
return m_reportService.queryBugReport(CatString.CAT, start, end);
}
private Map<String, ErrorStatis> sortErrorStatis(Map<String, ErrorStatis> errors) {
Comparator<java.util.Map.Entry<String, ErrorStatis>> errorCompator = new Comparator<java.util.Map.Entry<String, ErrorStatis>>() {
@Override
public int compare(java.util.Map.Entry<String, ErrorStatis> o1, java.util.Map.Entry<String, ErrorStatis> o2) {
String department1 = o1.getValue().getDepartment();
String department2 = o2.getValue().getDepartment();
String productLine1 = o1.getValue().getProductLine();
String productLine2 = o2.getValue().getProductLine();
if (department1.equals(department2)) {
return productLine1.compareTo(productLine2);
} else {
return department1.compareTo(department2);
}
}
};
errors = MapUtils.sortMap(errors, errorCompator);
for (ErrorStatis temp : errors.values()) {
Comparator<java.util.Map.Entry<String, ExceptionItem>> compator = new Comparator<java.util.Map.Entry<String, ExceptionItem>>() {
@Override
public int compare(java.util.Map.Entry<String, ExceptionItem> o1,
java.util.Map.Entry<String, ExceptionItem> o2) {
return o2.getValue().getCount() - o1.getValue().getCount();
}
};
Map<String, ExceptionItem> bugs = temp.getBugs();
Map<String, ExceptionItem> exceptions = temp.getExceptions();
temp.setBugs(MapUtils.sortMap(bugs, compator));
temp.setExceptions(MapUtils.sortMap(exceptions, compator));
}
return errors;
}
public class BugReportVisitor extends BaseVisitor {
private String m_domain;
private Map<String, ErrorStatis> m_errors = new HashMap<String, ErrorStatis>();
public ErrorStatis findOrCreateErrorStatis(String productLine) {
ErrorStatis statis = m_errors.get(productLine);
if (statis == null) {
statis = new ErrorStatis();
m_errors.put(productLine, statis);
}
return statis;
}
public Map<String, ErrorStatis> getErrors() {
return m_errors;
}
@Override
public void visitDomain(Domain domain) {
m_domain = domain.getId();
super.visitDomain(domain);
}
@Override
public void visitExceptionItem(ExceptionItem exceptionItem) {
String exception = exceptionItem.getId();
int count = exceptionItem.getCount();
Project project = findByDomain(m_domain);
if (project != null) {
String productLine = project.getProjectLine();
String department = project.getDepartment();
ErrorStatis statis = findOrCreateErrorStatis(productLine);
statis.setDepartment(department);
statis.setProductLine(productLine);
Map<String, ExceptionItem> items = null;
if (isBug(m_domain, exception)) {
items = statis.getBugs();
} else {
items = statis.getExceptions();
}
ExceptionItem item = items.get(exception);
if (item == null) {
item = new ExceptionItem(exception);
item.setCount(count);
item.getMessages().addAll(exceptionItem.getMessages());
items.put(exception, item);
} else {
List<String> messages = item.getMessages();
item.setCount(item.getCount() + count);
messages.addAll(exceptionItem.getMessages());
if (messages.size() > 10) {
messages = messages.subList(0, 10);
}
}
}
}
}
public class ClearBugReport extends BaseVisitor {
@Override
public void visitDomain(Domain domain) {
String domainName = domain.getId();
Set<String> removes = new HashSet<String>();
Map<String, ExceptionItem> items = domain.getExceptionItems();
for (ExceptionItem item : items.values()) {
if (!isBug(domainName, item.getId())) {
removes.add(item.getId());
}
}
for (String remove : removes) {
items.remove(remove);
}
}
}
public static class ErrorStatis {
private String m_productLine;
private String m_department;
private Map<String, ExceptionItem> m_bugs = new HashMap<String, ExceptionItem>();
private Map<String, ExceptionItem> m_exceptions = new HashMap<String, ExceptionItem>();
public Map<String, ExceptionItem> getBugs() {
return m_bugs;
}
public String getDepartment() {
return m_department;
}
public Map<String, ExceptionItem> getExceptions() {
return m_exceptions;
}
public String getProductLine() {
return m_productLine;
}
public void setBugs(Map<String, ExceptionItem> bugs) {
m_bugs = bugs;
}
public void setDepartment(String department) {
m_department = department;
}
public void setExceptions(Map<String, ExceptionItem> exceptions) {
m_exceptions = exceptions;
}
public void setProductLine(String productLine) {
m_productLine = productLine;
}
}
}
package com.dianping.cat.report.page.bug;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import org.unidal.dal.jdbc.DalException;
import org.unidal.lookup.annotation.Inject;
import org.unidal.web.mvc.PageHandler;
import org.unidal.web.mvc.annotation.InboundActionMeta;
import org.unidal.web.mvc.annotation.OutboundActionMeta;
import org.unidal.web.mvc.annotation.PayloadMeta;
import com.dianping.cat.Cat;
import com.dianping.cat.core.dal.Project;
import com.dianping.cat.core.dal.ProjectDao;
import com.dianping.cat.core.dal.ProjectEntity;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.MapUtils;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.bug.entity.Domain;
import com.dianping.cat.home.bug.entity.ExceptionItem;
import com.dianping.cat.home.bug.transform.BaseVisitor;
import com.dianping.cat.home.service.entity.ServiceReport;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.system.config.BugConfigManager;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject
private ReportService m_reportService;
@Inject
private ProjectDao m_projectDao;
@Inject
private BugConfigManager m_bugConfigManager;
@Inject
private PayloadNormalizer m_normalizePayload;
public Project findByDomain(String domain) {
try {
return m_projectDao.findByDomain(domain, ProjectEntity.READSET_FULL);
} catch (DalException e) {
Cat.logError(e);
}
return null;
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "bug")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "bug")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
m_normalizePayload.normalize(model, payload);
switch (payload.getAction()) {
case SERVICE_REPORT:
ServiceReport serviceReport = queryServiceReport(payload);
List<com.dianping.cat.home.service.entity.Domain> dList = sort(serviceReport, payload.getSortBy());
model.setServiceList(dList);
model.setServiceReport(serviceReport);
break;
case SERVICE_HISTORY_REPORT:
serviceReport = queryServiceReport(payload);
List<com.dianping.cat.home.service.entity.Domain> dHisList = sort(serviceReport, payload.getSortBy());
model.setServiceList(dHisList);
model.setServiceReport(serviceReport);
break;
case HISTORY_REPORT:
case HOURLY_REPORT:
case HTTP_JSON:
BugReport bugReport = queryBugReport(payload);
BugReportVisitor visitor = new BugReportVisitor();
visitor.visitBugReport(bugReport);
model.setBugReport(bugReport);
bugReport = queryBugReport(payload);
visitor = new BugReportVisitor();
visitor.visitBugReport(bugReport);
Map<String, ErrorStatis> errors = visitor.getErrors();
errors = sortErrorStatis(errors);
model.setErrorStatis(errors);
if (payload.getAction() == Action.HTTP_JSON) {
new ClearBugReport().visitBugReport(bugReport);
}
model.setBugReport(bugReport);
model.setPage(ReportPage.BUG);
break;
}
m_jspViewer.view(ctx, model);
}
private ServiceReport queryServiceReport(Payload payload) {
Date start = null;
Date end = null;
if (payload.getAction() == Action.SERVICE_REPORT) {
if (payload.getPeriod().isCurrent()) {
start = new Date(payload.getDate() - TimeUtil.ONE_HOUR);
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
} else {
start = new Date(payload.getDate());
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
}
} else {
start = payload.getHistoryStartDate();
end = payload.getHistoryEndDate();
}
return m_reportService.queryServiceReport(CatString.CAT, start, end);
}
private List<com.dianping.cat.home.service.entity.Domain> sort(ServiceReport serviceReport, final String sortBy) {
List<com.dianping.cat.home.service.entity.Domain> result = new ArrayList<com.dianping.cat.home.service.entity.Domain>(
serviceReport.getDomains().values());
Collections.sort(result, new Comparator<com.dianping.cat.home.service.entity.Domain>() {
public int compare(com.dianping.cat.home.service.entity.Domain d1,
com.dianping.cat.home.service.entity.Domain d2) {
if (sortBy.equals("failure")) {
return (int) (d2.getFailureCount() - d1.getFailureCount());
} else if (sortBy.equals("total")) {
return (int) (d2.getTotalCount() - d1.getTotalCount());
} else if (sortBy.equals("failurePercent")) {
return (int) (100000 * d2.getFailurePercent() - 100000 * d1.getFailurePercent());
} else {
return (int) (d2.getAvg() - d1.getAvg());
}
}
});
return result;
}
private boolean isBug(String domain, String exception) {
Set<String> bugConfig = m_bugConfigManager.queryBugConfigsByDomain(domain);
return !bugConfig.contains(exception);
}
private BugReport queryBugReport(Payload payload) {
Date start = null;
Date end = null;
if (payload.getAction() == Action.HOURLY_REPORT) {
if (payload.getPeriod().isCurrent()) {
start = new Date(payload.getDate() - TimeUtil.ONE_HOUR);
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
} else {
start = new Date(payload.getDate());
end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
}
} else {
start = payload.getHistoryStartDate();
end = payload.getHistoryEndDate();
}
return m_reportService.queryBugReport(CatString.CAT, start, end);
}
private Map<String, ErrorStatis> sortErrorStatis(Map<String, ErrorStatis> errors) {
Comparator<java.util.Map.Entry<String, ErrorStatis>> errorCompator = new Comparator<java.util.Map.Entry<String, ErrorStatis>>() {
@Override
public int compare(java.util.Map.Entry<String, ErrorStatis> o1, java.util.Map.Entry<String, ErrorStatis> o2) {
String department1 = o1.getValue().getDepartment();
String department2 = o2.getValue().getDepartment();
String productLine1 = o1.getValue().getProductLine();
String productLine2 = o2.getValue().getProductLine();
if (department1.equals(department2)) {
return productLine1.compareTo(productLine2);
} else {
return department1.compareTo(department2);
}
}
};
errors = MapUtils.sortMap(errors, errorCompator);
for (ErrorStatis temp : errors.values()) {
Comparator<java.util.Map.Entry<String, ExceptionItem>> compator = new Comparator<java.util.Map.Entry<String, ExceptionItem>>() {
@Override
public int compare(java.util.Map.Entry<String, ExceptionItem> o1,
java.util.Map.Entry<String, ExceptionItem> o2) {
return o2.getValue().getCount() - o1.getValue().getCount();
}
};
Map<String, ExceptionItem> bugs = temp.getBugs();
Map<String, ExceptionItem> exceptions = temp.getExceptions();
temp.setBugs(MapUtils.sortMap(bugs, compator));
temp.setExceptions(MapUtils.sortMap(exceptions, compator));
}
return errors;
}
public class BugReportVisitor extends BaseVisitor {
private String m_domain;
private Map<String, ErrorStatis> m_errors = new HashMap<String, ErrorStatis>();
public ErrorStatis findOrCreateErrorStatis(String productLine) {
ErrorStatis statis = m_errors.get(productLine);
if (statis == null) {
statis = new ErrorStatis();
m_errors.put(productLine, statis);
}
return statis;
}
public Map<String, ErrorStatis> getErrors() {
return m_errors;
}
@Override
public void visitDomain(Domain domain) {
m_domain = domain.getId();
super.visitDomain(domain);
}
@Override
public void visitExceptionItem(ExceptionItem exceptionItem) {
String exception = exceptionItem.getId();
int count = exceptionItem.getCount();
Project project = findByDomain(m_domain);
if (project != null) {
String productLine = project.getProjectLine();
String department = project.getDepartment();
ErrorStatis statis = findOrCreateErrorStatis(productLine);
statis.setDepartment(department);
statis.setProductLine(productLine);
Map<String, ExceptionItem> items = null;
if (isBug(m_domain, exception)) {
items = statis.getBugs();
} else {
items = statis.getExceptions();
}
ExceptionItem item = items.get(exception);
if (item == null) {
item = new ExceptionItem(exception);
item.setCount(count);
item.getMessages().addAll(exceptionItem.getMessages());
items.put(exception, item);
} else {
List<String> messages = item.getMessages();
item.setCount(item.getCount() + count);
messages.addAll(exceptionItem.getMessages());
if (messages.size() > 10) {
messages = messages.subList(0, 10);
}
}
}
}
}
public class ClearBugReport extends BaseVisitor {
@Override
public void visitDomain(Domain domain) {
String domainName = domain.getId();
Set<String> removes = new HashSet<String>();
Map<String, ExceptionItem> items = domain.getExceptionItems();
for (ExceptionItem item : items.values()) {
if (!isBug(domainName, item.getId())) {
removes.add(item.getId());
}
}
for (String remove : removes) {
items.remove(remove);
}
}
}
public static class ErrorStatis {
private String m_productLine;
private String m_department;
private Map<String, ExceptionItem> m_bugs = new HashMap<String, ExceptionItem>();
private Map<String, ExceptionItem> m_exceptions = new HashMap<String, ExceptionItem>();
public Map<String, ExceptionItem> getBugs() {
return m_bugs;
}
public String getDepartment() {
return m_department;
}
public Map<String, ExceptionItem> getExceptions() {
return m_exceptions;
}
public String getProductLine() {
return m_productLine;
}
public void setBugs(Map<String, ExceptionItem> bugs) {
m_bugs = bugs;
}
public void setDepartment(String department) {
m_department = department;
}
public void setExceptions(Map<String, ExceptionItem> exceptions) {
m_exceptions = exceptions;
}
public void setProductLine(String productLine) {
m_productLine = productLine;
}
}
}
package com.dianping.cat.report.page.bug;
public enum JspFile {
HOURLY_REPORT("/jsp/report/bug/bug.jsp"),
HISTORY_REPORT("/jsp/report/bug/bugHistory.jsp"),
HTTP_JSON("/jsp/report/bug/bugApi.jsp"),
;
private String m_path;
private JspFile(String path) {
m_path = path;
}
public String getPath() {
return m_path;
}
}
package com.dianping.cat.report.page.bug;
public enum JspFile {
HOURLY_REPORT("/jsp/report/bug/bug.jsp"),
HISTORY_REPORT("/jsp/report/bug/bugHistory.jsp"),
HTTP_JSON("/jsp/report/bug/bugApi.jsp"),
SERVICE_REPORT("/jsp/report/service/service.jsp"),
SERVICE_HISTORY_REPORT("/jsp/report/service/serviceHistory.jsp");
private String m_path;
private JspFile(String path) {
m_path = path;
}
public String getPath() {
return m_path;
}
}
package com.dianping.cat.report.page.bug;
import com.dianping.cat.report.ReportPage;
import org.unidal.web.mvc.view.BaseJspViewer;
public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model> {
@Override
protected String getJspFilePath(Context ctx, Model model) {
Action action = model.getAction();
switch (action) {
case HOURLY_REPORT:
return JspFile.HOURLY_REPORT.getPath();
case HISTORY_REPORT:
return JspFile.HISTORY_REPORT.getPath();
case HTTP_JSON:
return JspFile.HTTP_JSON.getPath();
}
throw new RuntimeException("Unknown action: " + action);
}
}
package com.dianping.cat.report.page.bug;
import com.dianping.cat.report.ReportPage;
import org.unidal.web.mvc.view.BaseJspViewer;
public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model> {
@Override
protected String getJspFilePath(Context ctx, Model model) {
Action action = model.getAction();
switch (action) {
case HOURLY_REPORT:
return JspFile.HOURLY_REPORT.getPath();
case HISTORY_REPORT:
return JspFile.HISTORY_REPORT.getPath();
case HTTP_JSON:
return JspFile.HTTP_JSON.getPath();
case SERVICE_REPORT:
return JspFile.SERVICE_REPORT.getPath();
case SERVICE_HISTORY_REPORT:
return JspFile.SERVICE_HISTORY_REPORT.getPath();
}
throw new RuntimeException("Unknown action: " + action);
}
}
package com.dianping.cat.report.page.bug;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.bug.transform.DefaultJsonBuilder;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.page.bug.Handler.ErrorStatis;
public class Model extends AbstractReportModel<Action, Context> {
private BugReport m_bugReport;
private Map<String, ErrorStatis> m_errorStatis;
public BugReport getBugReport() {
return m_bugReport;
}
public void setBugReport(BugReport bugReport) {
m_bugReport = bugReport;
}
public Map<String, ErrorStatis> getErrorStatis() {
return m_errorStatis;
}
public void setErrorStatis(Map<String, ErrorStatis> errorStatis) {
m_errorStatis = errorStatis;
}
public Model(Context ctx) {
super(ctx);
}
public String getBugs() {
return new DefaultJsonBuilder().buildJson(m_bugReport);
}
@Override
public Action getDefaultAction() {
return Action.HOURLY_REPORT;
}
@Override
public String getDomain() {
return CatString.CAT;
}
@Override
public Collection<String> getDomains() {
return new ArrayList<String>();
}
}
package com.dianping.cat.report.page.bug;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.bug.transform.DefaultJsonBuilder;
import com.dianping.cat.home.service.entity.ServiceReport;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.page.bug.Handler.ErrorStatis;
public class Model extends AbstractReportModel<Action, Context> {
private BugReport m_bugReport;
private ServiceReport m_serviceReport;
private List<com.dianping.cat.home.service.entity.Domain> serviceList;
public ServiceReport getServiceReport() {
return m_serviceReport;
}
public void setServiceReport(ServiceReport serviceReport) {
m_serviceReport = serviceReport;
}
public List<com.dianping.cat.home.service.entity.Domain> getServiceList() {
return serviceList;
}
public void setServiceList(List<com.dianping.cat.home.service.entity.Domain> serviceList) {
this.serviceList = serviceList;
}
private Map<String, ErrorStatis> m_errorStatis;
public BugReport getBugReport() {
return m_bugReport;
}
public void setBugReport(BugReport bugReport) {
m_bugReport = bugReport;
}
public Map<String, ErrorStatis> getErrorStatis() {
return m_errorStatis;
}
public void setErrorStatis(Map<String, ErrorStatis> errorStatis) {
m_errorStatis = errorStatis;
}
public Model(Context ctx) {
super(ctx);
}
public String getBugs() {
return new DefaultJsonBuilder().buildJson(m_bugReport);
}
@Override
public Action getDefaultAction() {
return Action.HOURLY_REPORT;
}
@Override
public String getDomain() {
return CatString.CAT;
}
@Override
public Collection<String> getDomains() {
return new ArrayList<String>();
}
}
package com.dianping.cat.report.page.bug;
import org.unidal.web.mvc.ActionContext;
import org.unidal.web.mvc.payload.annotation.FieldMeta;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.AbstractReportPayload;
public class Payload extends AbstractReportPayload<Action> {
private ReportPage m_page;
@FieldMeta("op")
private Action m_action;
public Payload() {
super(ReportPage.BUG);
}
@Override
public Action getAction() {
return m_action;
}
@Override
public ReportPage getPage() {
return m_page;
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.HOURLY_REPORT);
}
@Override
public void setPage(String page) {
m_page = ReportPage.getByName(page, ReportPage.BUG);
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.HOURLY_REPORT;
}
}
}
package com.dianping.cat.report.page.bug;
import org.unidal.web.mvc.ActionContext;
import org.unidal.web.mvc.payload.annotation.FieldMeta;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.AbstractReportPayload;
public class Payload extends AbstractReportPayload<Action> {
private ReportPage m_page;
@FieldMeta("op")
private Action m_action;
@FieldMeta("sort")
private String m_sortBy = "avg";
public String getSortBy() {
return m_sortBy;
}
public void setSortBy(String sortBy) {
m_sortBy = sortBy;
}
public Payload() {
super(ReportPage.BUG);
}
@Override
public Action getAction() {
return m_action;
}
@Override
public ReportPage getPage() {
return m_page;
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.HOURLY_REPORT);
}
@Override
public void setPage(String page) {
m_page = ReportPage.getByName(page, ReportPage.BUG);
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.HOURLY_REPORT;
}
}
}
......@@ -84,8 +84,8 @@ public class Handler implements PageHandler<Context> {
List<Message> messages = t.getChildren();
for (Message temp : messages) {
String type = temp.getType();
if (type.equals("URL.Server") || type.equals("ClientInfo")) {
String name = temp.getName();
if (name.equals("URL.Server") || name.equals("ClientInfo")) {
m_data = temp.getData().toString();
m_referer = parseValue("Referer", m_data);
......
......@@ -71,6 +71,12 @@ public class DisplayMatrix {
private int m_callMin;
private int m_callTime;
private String m_callUrl;
private String m_sqlUrl;
private String m_cacheUrl;
private double m_callTimePercent;
......@@ -171,6 +177,18 @@ public class DisplayMatrix {
public String getUrl() {
return m_url;
}
public String getCallUrl() {
return m_callUrl;
}
public String getSqlUrl() {
return m_sqlUrl;
}
public String getCacheUrl() {
return m_cacheUrl;
}
public void setBaseInfo(Matrix matrix) {
m_type = matrix.getType();
......@@ -183,7 +201,6 @@ public class DisplayMatrix {
}
public void setCacheInfo(Matrix matrix) {
Ratio ratio = matrix.getRatios().get("Cache");
if (ratio == null) {
return;
......@@ -191,6 +208,7 @@ public class DisplayMatrix {
m_cacheMin = ratio.getMin();
m_cacheMax = ratio.getMax();
m_cacheUrl = ratio.getUrl();
if (matrix.getCount() > 0) {
m_cacheAvg = (double) ratio.getTotalCount() / (double) matrix.getCount();
}
......@@ -210,6 +228,7 @@ public class DisplayMatrix {
m_callMin = ratio.getMin();
m_callMax = ratio.getMax();
m_callUrl = ratio.getUrl();
if (matrix.getCount() > 0) {
m_callAvg = (double) ratio.getTotalCount() / (double) matrix.getCount();
}
......@@ -229,6 +248,7 @@ public class DisplayMatrix {
m_sqlMin = ratio.getMin();
m_sqlMax = ratio.getMax();
m_sqlUrl = ratio.getUrl();
if (matrix.getCount() > 0) {
m_sqlAvg = (double) ratio.getTotalCount() / (double) matrix.getCount();
}
......@@ -241,7 +261,7 @@ public class DisplayMatrix {
}
}
static class MatrixItemCompartor implements Comparator<MatrixItem> {
public static class MatrixItemCompartor implements Comparator<MatrixItem> {
private String m_sort;
public MatrixItemCompartor(String sort) {
......
package com.dianping.cat.report.page.metric;
public enum Action implements org.unidal.web.mvc.Action {
VIEW("view");
METRIC("view"),
DASHBOARD("dashboard");
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
......
package com.dianping.cat.report.page.metric;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
......@@ -20,10 +22,12 @@ import com.dianping.cat.Cat;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.ProductLineConfigManager;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.service.ReportService;
......@@ -98,7 +102,6 @@ public class Handler implements PageHandler<Context> {
} else {
return getReportFromDB(product, date);
}
}
@Override
......@@ -114,41 +117,52 @@ public class Handler implements PageHandler<Context> {
Payload payload = ctx.getPayload();
normalize(model, payload);
String test = payload.getTest();
Date startTime = new Date(payload.getDate() - 23 * TimeUtil.ONE_HOUR);
Date endTime = new Date(payload.getDate() + TimeUtil.ONE_HOUR);
String product = payload.getProduct();
Action action = payload.getAction();
Collection<ProductLine> productLines = m_productLineConfigManager.queryProductLines().values();
long date = payload.getDate();
switch (action) {
case METRIC:
MetricDisplay display = buildMetricsByProduct(date, payload.getProduct(), payload.getTest(), false);
model.setLineCharts(display.getLineCharts());
model.setAbtests(display.getAbtests());
break;
case DASHBOARD:
List<LineChart> allCharts = new ArrayList<LineChart>();
for (ProductLine productLine : productLines) {
MetricDisplay metricDisplay = buildMetricsByProduct(date, productLine.getId(), payload.getTest(), true);
List<LineChart> charts = metricDisplay.getLineCharts();
allCharts.addAll(charts);
}
model.setLineCharts(allCharts);
break;
}
model.setProductLines(productLines);
m_jspViewer.view(ctx, model);
}
private MetricDisplay buildMetricsByProduct(long date, String product, String abtestID, boolean isDashboard) {
Date startTime = new Date(date - 23 * TimeUtil.ONE_HOUR);
List<String> domains = m_productLineConfigManager.queryProductLineDomains(product);
List<MetricItemConfig> domainSet = m_configManager.queryMetricItemConfigs(new HashSet<String>(domains));
MetricDisplay display = new MetricDisplay(domainSet, test, startTime);
display.setBaselineService(m_baselineService);
display.setAbtest(m_abtestService);
List<MetricItemConfig> metricConfigs = m_configManager.queryMetricItemConfigs(new HashSet<String>(domains));
MetricDisplay display = new MetricDisplay(metricConfigs, abtestID, startTime,isDashboard);
long date = startTime.getTime();
MetricReport report;
display.setBaselineService(m_baselineService).setAbtestService(m_abtestService);
long time = startTime.getTime();
for (int i = 0; i < 24; i++) {
// current hourly and last hourly report read this function
// last two hours ago read db (cache)
ModelPeriod period = payload.getPeriod();
report = getReport(period, product, date);
ModelPeriod period = ModelPeriod.getByTime(time);
MetricReport report = getReport(period, product, time);
if (report != null) {
display.visitMetricReport(i, report);
}
date = date + TimeUtil.ONE_HOUR;
time = time + TimeUtil.ONE_HOUR;
}
display.generateDailyLineCharts();
if (test.equals("-1")) {
if (abtestID.equals("-1")) {
display.generateBaselineChart();
}
report = new MetricReport();
report.setStartTime(startTime);
report.setEndTime(endTime);
model.setDisplay(display);
model.setReport(report);
model.setProductLines(m_productLineConfigManager.queryProductLines().values());
m_jspViewer.view(ctx, model);
return display;
}
private void normalize(Model model, Payload payload) {
......@@ -159,6 +173,11 @@ public class Handler implements PageHandler<Context> {
if (poduct == null || poduct.length() == 0) {
payload.setProduct(TUAN);
}
Date startTime = new Date(payload.getDate() - 23 * TimeUtil.ONE_HOUR);
Date endTime = new Date(payload.getDate() + TimeUtil.ONE_HOUR);
model.setStartTime(startTime);
model.setEndTime(endTime);
}
}
\ No newline at end of file
}
package com.dianping.cat.report.page.metric;
public enum JspFile {
VIEW("/jsp/report/metric.jsp"),
METRIC("/jsp/report/metric/metric.jsp"),
DASHBOARD("/jsp/report/metric/dashboard.jsp"),
;
private String m_path;
......
......@@ -10,8 +10,10 @@ public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model>
Action action = model.getAction();
switch (action) {
case VIEW:
return JspFile.VIEW.getPath();
case METRIC:
return JspFile.METRIC.getPath();
case DASHBOARD:
return JspFile.DASHBOARD.getPath();
}
throw new RuntimeException("Unknown action: " + action);
......
......@@ -50,8 +50,6 @@ public class MetricDisplay extends BaseVisitor {
private static final int INTERVAL = 10;
// private static final int INTERVAL_POINT = 5;
private static final int HOUR = 24;
private static final int MINUTE = 60;
......@@ -60,29 +58,52 @@ public class MetricDisplay extends BaseVisitor {
private static final String METRIC_STRING = "metric";
public List<LineChart> getLineCharts() {
return new ArrayList<LineChart>(m_lineCharts.values());
private boolean m_isDashboard;
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start) {
this(configs, abtest, start, false);
}
public Map<Integer, com.dianping.cat.home.dal.abtest.Abtest> getAbtests() {
return m_abtests;
private boolean showAvg(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowAvgDashboard() && config.getShowAvg();
} else {
return config.getShowAvg();
}
}
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start) {
private boolean showSum(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowSumDashboard() && config.getShowSum();
} else {
return config.getShowSum();
}
}
private boolean showCount(MetricItemConfig config) {
if (m_isDashboard) {
return config.isShowCountDashboard() && config.getShowCount();
} else {
return config.getShowCount();
}
}
public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start, boolean isDashboard) {
m_isDashboard = isDashboard;
m_start = start;
m_abtest = abtest;
for (MetricItemConfig config : configs) {
String configKey = config.getId();
if (config.isShowSum()) {
if (showSum(config)) {
String key = configKey + ":" + SUM;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_SUM));
}
if (config.isShowCount()) {
if (showCount(config)) {
String key = configKey + ":" + COUNT;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_COUNT));
}
if (config.isShowAvg()) {
if (showAvg(config)) {
String key = configKey + ":" + AVG;
m_lineCharts.put(key, createLineChart(config.getTitle() + CatString.Suffix_AVG));
}
......@@ -91,7 +112,6 @@ public class MetricDisplay extends BaseVisitor {
private LineChart createLineChart(String title) {
LineChart lineChart = new LineChart();
lineChart.setTitle(title);
lineChart.setStart(m_start);
lineChart.setSize(POINT_NUM);
......@@ -99,23 +119,26 @@ public class MetricDisplay extends BaseVisitor {
return lineChart;
}
@Override
public void visitAbtest(Abtest abtest) {
String abtestId = abtest.getRunId();
int id = Integer.parseInt(abtestId);
com.dianping.cat.home.dal.abtest.Abtest temp = findAbTest(id);
private com.dianping.cat.home.dal.abtest.Abtest findAbTest(int id) {
com.dianping.cat.home.dal.abtest.Abtest abtest = null;
if (id >= 0) {
abtest = m_abtestService.getABTestNameByRunId(id);
}
if (abtest == null) {
abtest = new com.dianping.cat.home.dal.abtest.Abtest();
m_abtests.put(id, temp);
if (m_abtest.equals(abtestId)) {
super.visitAbtest(abtest);
abtest.setId(id);
abtest.setName(String.valueOf(id));
}
return abtest;
}
private LineChart findOrCreateChart(String type, String metricKey, String computeType) {
String key = metricKey + ":" + computeType;
LineChart chart = m_lineCharts.get(key);
if (chart == null) {
if (chart == null && !m_isDashboard) {
if (computeType.equals(COUNT)) {
if (type.equals("C") || type.equals("S,C")) {
chart = createLineChart(key);
......@@ -129,87 +152,13 @@ public class MetricDisplay extends BaseVisitor {
chart = createLineChart(key);
}
}
if (chart != null) {
m_lineCharts.put(key, chart);
}
}
return chart;
}
@Override
public void visitGroup(Group group) {
String id = group.getName();
if ("".equals(id)) {
id = "Default";
}
id = id + ":" + m_index;
double[] sum = new double[60];
double[] avg = new double[60];
double[] count = new double[60];
for (Point point : group.getPoints().values()) {
int index = point.getId();
sum[index] = point.getSum();
avg[index] = point.getAvg();
count[index] = point.getCount();
}
LineChart sumLine = findOrCreateChart(m_currentComputeType, m_metricKey, SUM);
if (sumLine != null) {
sumLine.addSubTitle(id);
sumLine.addValue(sum);
}
LineChart countLine = findOrCreateChart(m_currentComputeType, m_metricKey, COUNT);
if (countLine != null) {
countLine.addSubTitle(id);
countLine.addValue(count);
}
LineChart avgLine = findOrCreateChart(m_currentComputeType, m_metricKey, AVG);
if (avgLine != null) {
avgLine.addSubTitle(id);
avgLine.addValue(avg);
}
}
@Override
public void visitMetricItem(MetricItem metricItem) {
m_metricKey = metricItem.getId();
m_currentComputeType = metricItem.getType();
super.visitMetricItem(metricItem);
}
@Override
public void visitMetricReport(MetricReport metricReport) {
super.visitMetricReport(metricReport);
}
public void setAbtest(ABTestService service) {
m_abtestService = service;
}
private com.dianping.cat.home.dal.abtest.Abtest findAbTest(int id) {
com.dianping.cat.home.dal.abtest.Abtest abtest = null;
if (id >= 0) {
abtest = m_abtestService.getABTestNameByRunId(id);
}
if (abtest == null) {
abtest = new com.dianping.cat.home.dal.abtest.Abtest();
abtest.setId(id);
abtest.setName(String.valueOf(id));
}
return abtest;
}
public void generateBaselineChart() {
for (String key : m_lineCharts.keySet()) {
LineChart lineChart = m_lineCharts.get(key);
......@@ -230,7 +179,6 @@ public class MetricDisplay extends BaseVisitor {
}
value[i] = sumOfArray(day, j);
}
lineChart.addSubTitle("Baseline");
lineChart.addValue(value);
}
......@@ -261,12 +209,30 @@ public class MetricDisplay extends BaseVisitor {
values.clear();
subTitles.clear();
for (String subTitle : resultMap.keySet()) {
subTitles.add(subTitle);
subTitles.add("Current");
values.add(resultMap.get(subTitle));
}
}
}
public Map<Integer, com.dianping.cat.home.dal.abtest.Abtest> getAbtests() {
return m_abtests;
}
public List<LineChart> getLineCharts() {
return new ArrayList<LineChart>(m_lineCharts.values());
}
public MetricDisplay setAbtestService(ABTestService service) {
m_abtestService = service;
return this;
}
public MetricDisplay setBaselineService(BaselineService baselineService) {
m_baselineService = baselineService;
return this;
}
private double sumOfArray(double[] values, int j) {
double result = 0;
for (int i = j; i < j + INTERVAL; i++) {
......@@ -277,8 +243,64 @@ public class MetricDisplay extends BaseVisitor {
return result;
}
public void setBaselineService(BaselineService baselineService) {
m_baselineService = baselineService;
@Override
public void visitAbtest(Abtest abtest) {
String abtestId = abtest.getRunId();
int id = Integer.parseInt(abtestId);
com.dianping.cat.home.dal.abtest.Abtest temp = findAbTest(id);
m_abtests.put(id, temp);
if (m_abtest.equals(abtestId)) {
super.visitAbtest(abtest);
}
}
@Override
public void visitGroup(Group group) {
String id = group.getName();
if ("".equals(id)) {
id = "Default";
}
id = id + ":" + m_index;
double[] sum = new double[60];
double[] avg = new double[60];
double[] count = new double[60];
for (Point point : group.getPoints().values()) {
int index = point.getId();
sum[index] = point.getSum();
avg[index] = point.getAvg();
count[index] = point.getCount();
}
LineChart sumLine = findOrCreateChart(m_currentComputeType, m_metricKey, SUM);
if (sumLine != null) {
sumLine.addSubTitle(id);
sumLine.addValue(sum);
}
LineChart countLine = findOrCreateChart(m_currentComputeType, m_metricKey, COUNT);
if (countLine != null) {
countLine.addSubTitle(id);
countLine.addValue(count);
}
LineChart avgLine = findOrCreateChart(m_currentComputeType, m_metricKey, AVG);
if (avgLine != null) {
avgLine.addSubTitle(id);
avgLine.addValue(avg);
}
}
@Override
public void visitMetricItem(MetricItem metricItem) {
m_metricKey = metricItem.getId();
m_currentComputeType = metricItem.getType();
super.visitMetricItem(metricItem);
}
public void visitMetricReport(int index, MetricReport report) {
......@@ -286,4 +308,9 @@ public class MetricDisplay extends BaseVisitor {
visitMetricReport(report);
}
@Override
public void visitMetricReport(MetricReport metricReport) {
super.visitMetricReport(metricReport);
}
}
\ No newline at end of file
package com.dianping.cat.report.page.metric;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.home.dal.abtest.Abtest;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.page.LineChart;
public class Model extends AbstractReportModel<Action, Context> {
private MetricReport m_report;
private MetricDisplay m_display;
private List<LineChart> m_lineCharts;
private Collection<ProductLine> m_productLines;
private Date m_startTime;
private Date m_endTime;
private Map<Integer, Abtest> m_abtests;
public Model(Context ctx) {
super(ctx);
......@@ -21,11 +29,7 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public Action getDefaultAction() {
return Action.VIEW;
}
public MetricDisplay getDisplay() {
return m_display;
return Action.METRIC;
}
@Override
......@@ -38,14 +42,6 @@ public class Model extends AbstractReportModel<Action, Context> {
return new HashSet<String>();
}
public MetricReport getReport() {
return m_report;
}
public void setDisplay(MetricDisplay display) {
m_display = display;
}
public Collection<ProductLine> getProductLines() {
return m_productLines;
}
......@@ -54,8 +50,36 @@ public class Model extends AbstractReportModel<Action, Context> {
m_productLines = productLines;
}
public void setReport(MetricReport report) {
m_report = report;
}
public List<LineChart> getLineCharts() {
return m_lineCharts;
}
public void setLineCharts(List<LineChart> lineCharts) {
m_lineCharts = lineCharts;
}
public Date getStartTime() {
return m_startTime;
}
public void setStartTime(Date startTime) {
m_startTime = startTime;
}
public Date getEndTime() {
return m_endTime;
}
public void setEndTime(Date endTime) {
m_endTime = endTime;
}
public void setAbtests(Map<Integer, Abtest> abtests) {
m_abtests = abtests;
}
public Map<Integer, Abtest> getAbtests() {
return m_abtests;
}
}
......@@ -33,7 +33,7 @@ public class Payload extends AbstractReportPayload<Action> {
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.VIEW);
m_action = Action.getByName(action, Action.METRIC);
}
@Override
......@@ -60,7 +60,7 @@ public class Payload extends AbstractReportPayload<Action> {
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.VIEW;
m_action = Action.METRIC;
}
}
}
package com.dianping.cat.report.service;
import java.util.Date;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface DailyReportService {
public CrossReport queryCrossReport(String domain, Date start, Date end);
public EventReport queryEventReport(String domain, Date start, Date end);
public HeartbeatReport queryHeartbeatReport(String domain, Date start, Date end);
public MatrixReport queryMatrixReport(String domain, Date start, Date end);
public ProblemReport queryProblemReport(String domain, Date start, Date end);
public SqlReport querySqlReport(String domain, Date start, Date end);
public StateReport queryStateReport(String domain,Date start,Date end);
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
public boolean insert(DailyReport report);
public BugReport queryBugReport(String domain, Date start, Date end);
}
package com.dianping.cat.report.service;
import java.util.Date;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
public interface DailyReportService {
public boolean insert(DailyReport report);
public BugReport queryBugReport(String domain, Date start, Date end);
public CrossReport queryCrossReport(String domain, Date start, Date end);
public EventReport queryEventReport(String domain, Date start, Date end);
public HeartbeatReport queryHeartbeatReport(String domain, Date start, Date end);
public MatrixReport queryMatrixReport(String domain, Date start, Date end);
public ProblemReport queryProblemReport(String domain, Date start, Date end);
public ServiceReport queryServiceReport(String domain, Date start, Date end);
public SqlReport querySqlReport(String domain, Date start, Date end);
public StateReport queryStateReport(String domain,Date start,Date end);
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.Set;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface HourlyReportService {
public Set<String> queryAllDomainNames(Date start, Date end, String reportName);
public CrossReport queryCrossReport(String domain, Date start, Date end);
public EventReport queryEventReport(String domain, Date start, Date end);
public HeartbeatReport queryHeartbeatReport(String domain, Date start, Date end);
public MatrixReport queryMatrixReport(String domain, Date start, Date end);
public MetricReport queryMetricReport(String group, Date start, Date end);
public ProblemReport queryProblemReport(String domain, Date start, Date end);
public SqlReport querySqlReport(String domain, Date start, Date end);
public StateReport queryStateReport(String domain,Date start,Date end);
public TopReport queryTopReport(String domain,Date start,Date end);
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
public DependencyReport queryDependencyReport(String domain, Date start, Date end);
public BugReport queryBugReport(String domain, Date start, Date end);
public boolean insert(HourlyReport report);
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.Set;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
public interface HourlyReportService {
public boolean insert(HourlyReport report);
public Set<String> queryAllDomainNames(Date start, Date end, String reportName);
public BugReport queryBugReport(String domain, Date start, Date end);
public CrossReport queryCrossReport(String domain, Date start, Date end);
public DependencyReport queryDependencyReport(String domain, Date start, Date end);
public EventReport queryEventReport(String domain, Date start, Date end);
public HeartbeatReport queryHeartbeatReport(String domain, Date start, Date end);
public MatrixReport queryMatrixReport(String domain, Date start, Date end);
public MetricReport queryMetricReport(String group, Date start, Date end);
public ProblemReport queryProblemReport(String domain, Date start, Date end);
public ServiceReport queryServiceReport(String domain, Date start, Date end);
public SqlReport querySqlReport(String domain, Date start, Date end);
public StateReport queryStateReport(String domain,Date start,Date end);
public TopReport queryTopReport(String domain,Date start,Date end);
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.MatrixReportFilter;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.message.Transaction;
public class MonthlyReportCache implements Initializable {
private long m_end;
private Map<String, TransactionReport> m_transactionReports = new HashMap<String, TransactionReport>();
private Map<String, EventReport> m_eventReports = new HashMap<String, EventReport>();
private Map<String, ProblemReport> m_problemReports = new HashMap<String, ProblemReport>();
private Map<String, MatrixReport> m_matrixReports = new HashMap<String, MatrixReport>();
private Map<String, CrossReport> m_crossReports = new HashMap<String, CrossReport>();
private Map<String, SqlReport> m_sqlReports = new HashMap<String, SqlReport>();
private Map<String, StateReport> m_stateReports = new HashMap<String, StateReport>();
private Map<String, BugReport> m_bugReports = new HashMap<String, BugReport>();
@Inject
private DailyReportService m_dailyReportService;
@Inject
private HourlyReportService m_hourReportService;
@Inject
private ServerConfigManager m_serverConfigManager;
@Override
public void initialize() throws InitializationException {
if (m_serverConfigManager.isJobMachine()) {
Threads.forGroup("Cat").start(new Reload());
}
}
public CrossReport queryCrossReport(String domain, Date start) {
return m_crossReports.get(domain);
}
public EventReport queryEventReport(String domain, Date start) {
return m_eventReports.get(domain);
}
public HeartbeatReport queryHeartbeatReport(String domain, Date start) {
return null;
}
public MatrixReport queryMatrixReport(String domain, Date start) {
return m_matrixReports.get(domain);
}
public ProblemReport queryProblemReport(String domain, Date start) {
return m_problemReports.get(domain);
}
public SqlReport querySqlReport(String domain, Date start) {
return m_sqlReports.get(domain);
}
public StateReport queryStateReport(String domain, Date start) {
return m_stateReports.get(domain);
}
public TransactionReport queryTransactionReport(String domain, Date start) {
return m_transactionReports.get(domain);
}
public class Reload implements Task {
@Override
public String getName() {
return "Month-Report-Cache";
}
private void reload() {
Date start = TimeUtil.getCurrentMonth();
Date end = TimeUtil.getCurrentDay();
Set<String> domains = m_hourReportService.queryAllDomainNames(start, end, "transaction");
for (String domain : domains) {
TransactionReport transactionReport = m_dailyReportService.queryTransactionReport(domain, start, end);
new TransactionReportUrlFilter().visitTransactionReport(transactionReport);
m_transactionReports.put(domain, transactionReport);
m_eventReports.put(domain, m_dailyReportService.queryEventReport(domain, start, end));
m_problemReports.put(domain, m_dailyReportService.queryProblemReport(domain, start, end));
m_crossReports.put(domain, m_dailyReportService.queryCrossReport(domain, start, end));
MatrixReport matrixReport = m_dailyReportService.queryMatrixReport(domain, start, end);
m_matrixReports.put(domain, matrixReport);
new MatrixReportFilter().visitMatrixReport(matrixReport);
m_sqlReports.put(domain, m_dailyReportService.querySqlReport(domain, start, end));
}
String cat = "Cat";
m_stateReports.put(cat, m_dailyReportService.queryStateReport(cat, start, end));
m_bugReports.put(cat, m_dailyReportService.queryBugReport(cat, start, end));
m_end = end.getTime();
}
@Override
public void run() {
boolean active = true;
while (active) {
Date date = TimeUtil.getCurrentDay();
long time = date.getTime();
if (time > m_end) {
Transaction t = Cat.newTransaction("ReportReload", "Month");
try {
reload();
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
} finally {
t.complete();
}
}
try {
Thread.sleep(60 * 60 * 1000);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
public BugReport queryBugReport(String domain, Date start) {
return m_bugReports.get(domain);
}
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.MatrixReportFilter;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
import com.dianping.cat.message.Transaction;
public class MonthlyReportCache implements Initializable {
private long m_end;
private Map<String, TransactionReport> m_transactionReports = new HashMap<String, TransactionReport>();
private Map<String, EventReport> m_eventReports = new HashMap<String, EventReport>();
private Map<String, ProblemReport> m_problemReports = new HashMap<String, ProblemReport>();
private Map<String, MatrixReport> m_matrixReports = new HashMap<String, MatrixReport>();
private Map<String, CrossReport> m_crossReports = new HashMap<String, CrossReport>();
private Map<String, SqlReport> m_sqlReports = new HashMap<String, SqlReport>();
private Map<String, StateReport> m_stateReports = new HashMap<String, StateReport>();
private Map<String, BugReport> m_bugReports = new HashMap<String, BugReport>();
private Map<String, ServiceReport> m_serviceReports = new HashMap<String, ServiceReport>();
@Inject
private DailyReportService m_dailyReportService;
@Inject
private HourlyReportService m_hourReportService;
@Inject
private ServerConfigManager m_serverConfigManager;
@Override
public void initialize() throws InitializationException {
if (m_serverConfigManager.isJobMachine()) {
Threads.forGroup("Cat").start(new Reload());
}
}
public BugReport queryBugReport(String domain, Date start) {
return m_bugReports.get(domain);
}
public CrossReport queryCrossReport(String domain, Date start) {
return m_crossReports.get(domain);
}
public EventReport queryEventReport(String domain, Date start) {
return m_eventReports.get(domain);
}
public HeartbeatReport queryHeartbeatReport(String domain, Date start) {
return null;
}
public MatrixReport queryMatrixReport(String domain, Date start) {
return m_matrixReports.get(domain);
}
public ProblemReport queryProblemReport(String domain, Date start) {
return m_problemReports.get(domain);
}
public ServiceReport queryServiceReport(String domain, Date start) {
return m_serviceReports.get(domain);
}
public SqlReport querySqlReport(String domain, Date start) {
return m_sqlReports.get(domain);
}
public StateReport queryStateReport(String domain, Date start) {
return m_stateReports.get(domain);
}
public TransactionReport queryTransactionReport(String domain, Date start) {
return m_transactionReports.get(domain);
}
public class Reload implements Task {
@Override
public String getName() {
return "Month-Report-Cache";
}
private void reload() {
Date start = TimeUtil.getCurrentMonth();
Date end = TimeUtil.getCurrentDay();
Set<String> domains = m_hourReportService.queryAllDomainNames(start, end, "transaction");
for (String domain : domains) {
TransactionReport transactionReport = m_dailyReportService.queryTransactionReport(domain, start, end);
new TransactionReportUrlFilter().visitTransactionReport(transactionReport);
m_transactionReports.put(domain, transactionReport);
m_eventReports.put(domain, m_dailyReportService.queryEventReport(domain, start, end));
m_problemReports.put(domain, m_dailyReportService.queryProblemReport(domain, start, end));
m_crossReports.put(domain, m_dailyReportService.queryCrossReport(domain, start, end));
MatrixReport matrixReport = m_dailyReportService.queryMatrixReport(domain, start, end);
m_matrixReports.put(domain, matrixReport);
new MatrixReportFilter().visitMatrixReport(matrixReport);
m_sqlReports.put(domain, m_dailyReportService.querySqlReport(domain, start, end));
}
String cat = "Cat";
m_stateReports.put(cat, m_dailyReportService.queryStateReport(cat, start, end));
m_bugReports.put(cat, m_dailyReportService.queryBugReport(cat, start, end));
m_serviceReports.put(cat, m_dailyReportService.queryServiceReport(cat, start, end));
m_end = end.getTime();
}
@Override
public void run() {
boolean active = true;
while (active) {
Date date = TimeUtil.getCurrentDay();
long time = date.getTime();
if (time > m_end) {
Transaction t = Cat.newTransaction("ReportReload", "Month");
try {
reload();
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
} finally {
t.complete();
}
}
try {
Thread.sleep(60 * 60 * 1000);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
}
package com.dianping.cat.report.service;
import java.util.Date;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface MonthlyReportService {
public CrossReport queryCrossReport(String domain, Date start);
public EventReport queryEventReport(String domain, Date start);
public HeartbeatReport queryHeartbeatReport(String domain, Date start);
public MatrixReport queryMatrixReport(String domain, Date start);
public ProblemReport queryProblemReport(String domain, Date start);
public SqlReport querySqlReport(String domain, Date start);
public StateReport queryStateReport(String domain, Date start);
public TransactionReport queryTransactionReport(String domain, Date start);
public boolean insert(MonthlyReport report);
public BugReport queryBugReport(String domain, Date start);
}
package com.dianping.cat.report.service;
import java.util.Date;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
public interface MonthlyReportService {
public boolean insert(MonthlyReport report);
public BugReport queryBugReport(String domain, Date start);
public CrossReport queryCrossReport(String domain, Date start);
public EventReport queryEventReport(String domain, Date start);
public HeartbeatReport queryHeartbeatReport(String domain, Date start);
public MatrixReport queryMatrixReport(String domain, Date start);
public ProblemReport queryProblemReport(String domain, Date start);
public ServiceReport queryServiceReport(String domain, Date start);
public SqlReport querySqlReport(String domain, Date start);
public StateReport queryStateReport(String domain, Date start);
public TransactionReport queryTransactionReport(String domain, Date start);
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.Set;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface ReportService {
public Set<String> queryAllDomainNames(Date start, Date end, String reportName);
public CrossReport queryCrossReport(String domain, Date start, Date end);
public EventReport queryEventReport(String domain, Date start, Date end);
public HeartbeatReport queryHeartbeatReport(String domain, Date start, Date end);
public MatrixReport queryMatrixReport(String domain, Date start, Date end);
public MetricReport queryMetricReport(String domain, Date start, Date end);
public ProblemReport queryProblemReport(String domain, Date start, Date end);
public SqlReport querySqlReport(String domain, Date start, Date end);
public StateReport queryStateReport(String domain,Date start,Date end);
public TopReport queryTopReport(String domain,Date start,Date end);
public DependencyReport queryDependencyReport(String domain,Date start,Date end);
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
public BugReport queryBugReport(String domain, Date start, Date end);
public boolean insertHourlyReport(HourlyReport report);
public boolean insertDailyReport(DailyReport report);
public boolean insertWeeklyReport(WeeklyReport report);
public boolean insertMonthlyReport(MonthlyReport report);
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.Set;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
public interface ReportService {
public boolean insertDailyReport(DailyReport report);
public boolean insertHourlyReport(HourlyReport report);
public boolean insertMonthlyReport(MonthlyReport report);
public boolean insertWeeklyReport(WeeklyReport report);
public Set<String> queryAllDomainNames(Date start, Date end, String reportName);
public BugReport queryBugReport(String domain, Date start, Date end);
public CrossReport queryCrossReport(String domain, Date start, Date end);
public DependencyReport queryDependencyReport(String domain,Date start,Date end);
public EventReport queryEventReport(String domain, Date start, Date end);
public HeartbeatReport queryHeartbeatReport(String domain, Date start, Date end);
public MatrixReport queryMatrixReport(String domain, Date start, Date end);
public MetricReport queryMetricReport(String domain, Date start, Date end);
public ProblemReport queryProblemReport(String domain, Date start, Date end);
public ServiceReport queryServiceReport(String domain, Date start, Date end);
public SqlReport querySqlReport(String domain, Date start, Date end);
public StateReport queryStateReport(String domain,Date start,Date end);
public TopReport queryTopReport(String domain,Date start,Date end);
public TransactionReport queryTransactionReport(String domain, Date start, Date end);
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.MatrixReportFilter;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.message.Transaction;
public class WeeklyReportCache implements Initializable {
private long m_end;
private Map<String, TransactionReport> m_transactionReports = new HashMap<String, TransactionReport>();
private Map<String, EventReport> m_eventReports = new HashMap<String, EventReport>();
private Map<String, ProblemReport> m_problemReports = new HashMap<String, ProblemReport>();
private Map<String, MatrixReport> m_matrixReports = new HashMap<String, MatrixReport>();
private Map<String, CrossReport> m_crossReports = new HashMap<String, CrossReport>();
private Map<String, SqlReport> m_sqlReports = new HashMap<String, SqlReport>();
private Map<String, StateReport> m_stateReports = new HashMap<String, StateReport>();
private Map<String, BugReport> m_bugReports = new HashMap<String, BugReport>();
@Inject
private DailyReportService m_dailyReportService;
@Inject
private HourlyReportService m_hourReportService;
@Inject
private ServerConfigManager m_serverConfigManager;
@Override
public void initialize() throws InitializationException {
if (m_serverConfigManager.isJobMachine()) {
Threads.forGroup("Cat").start(new Reload());
}
}
public CrossReport queryCrossReport(String domain, Date start) {
return m_crossReports.get(domain);
}
public EventReport queryEventReport(String domain, Date start) {
return m_eventReports.get(domain);
}
public HeartbeatReport queryHeartbeatReport(String domain, Date start) {
return null;
}
public MatrixReport queryMatrixReport(String domain, Date start) {
return m_matrixReports.get(domain);
}
public ProblemReport queryProblemReport(String domain, Date start) {
return m_problemReports.get(domain);
}
public SqlReport querySqlReport(String domain, Date start) {
return m_sqlReports.get(domain);
}
public StateReport queryStateReport(String domain, Date start) {
return m_stateReports.get(domain);
}
public TransactionReport queryTransactionReport(String domain, Date start) {
return m_transactionReports.get(domain);
}
public class Reload implements Task {
@Override
public String getName() {
return "Weekly-Report-Cache";
}
private void reload() {
Date start = TimeUtil.getCurrentWeek();
Date end = TimeUtil.getCurrentDay();
Set<String> domains = m_hourReportService.queryAllDomainNames(start, end, "transaction");
for (String domain : domains) {
TransactionReport transactionReport = m_dailyReportService.queryTransactionReport(domain, start, end);
new TransactionReportUrlFilter().visitTransactionReport(transactionReport);
m_transactionReports.put(domain, transactionReport);
m_eventReports.put(domain, m_dailyReportService.queryEventReport(domain, start, end));
m_problemReports.put(domain, m_dailyReportService.queryProblemReport(domain, start, end));
m_crossReports.put(domain, m_dailyReportService.queryCrossReport(domain, start, end));
MatrixReport matrixReport = m_dailyReportService.queryMatrixReport(domain, start, end);
m_matrixReports.put(domain, matrixReport);
new MatrixReportFilter().visitMatrixReport(matrixReport);
m_sqlReports.put(domain, m_dailyReportService.querySqlReport(domain, start, end));
}
String cat = "Cat";
m_stateReports.put(cat, m_dailyReportService.queryStateReport(cat, start, end));
m_bugReports.put(cat, m_dailyReportService.queryBugReport(cat, start, end));
m_end = end.getTime();
}
@Override
public void run() {
boolean active = true;
while (active) {
Date date = TimeUtil.getCurrentDay();
long time = date.getTime();
if (time > m_end) {
Transaction t = Cat.newTransaction("ReportReload", "Week");
try {
reload();
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
} finally {
t.complete();
}
}
try {
Thread.sleep(60 * 60 * 1000);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
public BugReport queryBugReport(String domain, Date start) {
return m_bugReports.get(domain);
}
}
package com.dianping.cat.report.service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.MatrixReportFilter;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
import com.dianping.cat.message.Transaction;
public class WeeklyReportCache implements Initializable {
private long m_end;
private Map<String, TransactionReport> m_transactionReports = new HashMap<String, TransactionReport>();
private Map<String, EventReport> m_eventReports = new HashMap<String, EventReport>();
private Map<String, ProblemReport> m_problemReports = new HashMap<String, ProblemReport>();
private Map<String, MatrixReport> m_matrixReports = new HashMap<String, MatrixReport>();
private Map<String, CrossReport> m_crossReports = new HashMap<String, CrossReport>();
private Map<String, SqlReport> m_sqlReports = new HashMap<String, SqlReport>();
private Map<String, StateReport> m_stateReports = new HashMap<String, StateReport>();
private Map<String, BugReport> m_bugReports = new HashMap<String, BugReport>();
private Map<String, ServiceReport> m_serviceReports = new HashMap<String, ServiceReport>();
@Inject
private DailyReportService m_dailyReportService;
@Inject
private HourlyReportService m_hourReportService;
@Inject
private ServerConfigManager m_serverConfigManager;
@Override
public void initialize() throws InitializationException {
if (m_serverConfigManager.isJobMachine()) {
Threads.forGroup("Cat").start(new Reload());
}
}
public BugReport queryBugReport(String domain, Date start) {
return m_bugReports.get(domain);
}
public CrossReport queryCrossReport(String domain, Date start) {
return m_crossReports.get(domain);
}
public EventReport queryEventReport(String domain, Date start) {
return m_eventReports.get(domain);
}
public HeartbeatReport queryHeartbeatReport(String domain, Date start) {
return null;
}
public MatrixReport queryMatrixReport(String domain, Date start) {
return m_matrixReports.get(domain);
}
public ProblemReport queryProblemReport(String domain, Date start) {
return m_problemReports.get(domain);
}
public ServiceReport queryServiceReport(String domain, Date start) {
return m_serviceReports.get(domain);
}
public SqlReport querySqlReport(String domain, Date start) {
return m_sqlReports.get(domain);
}
public StateReport queryStateReport(String domain, Date start) {
return m_stateReports.get(domain);
}
public TransactionReport queryTransactionReport(String domain, Date start) {
return m_transactionReports.get(domain);
}
public class Reload implements Task {
@Override
public String getName() {
return "Weekly-Report-Cache";
}
private void reload() {
Date start = TimeUtil.getCurrentWeek();
Date end = TimeUtil.getCurrentDay();
Set<String> domains = m_hourReportService.queryAllDomainNames(start, end, "transaction");
for (String domain : domains) {
TransactionReport transactionReport = m_dailyReportService.queryTransactionReport(domain, start, end);
new TransactionReportUrlFilter().visitTransactionReport(transactionReport);
m_transactionReports.put(domain, transactionReport);
m_eventReports.put(domain, m_dailyReportService.queryEventReport(domain, start, end));
m_problemReports.put(domain, m_dailyReportService.queryProblemReport(domain, start, end));
m_crossReports.put(domain, m_dailyReportService.queryCrossReport(domain, start, end));
MatrixReport matrixReport = m_dailyReportService.queryMatrixReport(domain, start, end);
m_matrixReports.put(domain, matrixReport);
new MatrixReportFilter().visitMatrixReport(matrixReport);
m_sqlReports.put(domain, m_dailyReportService.querySqlReport(domain, start, end));
}
String cat = "Cat";
m_stateReports.put(cat, m_dailyReportService.queryStateReport(cat, start, end));
m_bugReports.put(cat, m_dailyReportService.queryBugReport(cat, start, end));
m_serviceReports.put(cat, m_dailyReportService.queryServiceReport(cat, start, end));
m_end = end.getTime();
}
@Override
public void run() {
boolean active = true;
while (active) {
Date date = TimeUtil.getCurrentDay();
long time = date.getTime();
if (time > m_end) {
Transaction t = Cat.newTransaction("ReportReload", "Week");
try {
reload();
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
} finally {
t.complete();
}
}
try {
Thread.sleep(60 * 60 * 1000);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
}
package com.dianping.cat.report.service;
import java.util.Date;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.home.bug.entity.BugReport;
public interface WeeklyReportService {
public CrossReport queryCrossReport(String domain, Date start);
public EventReport queryEventReport(String domain, Date start);
public HeartbeatReport queryHeartbeatReport(String domain, Date start);
public MatrixReport queryMatrixReport(String domain, Date start);
public ProblemReport queryProblemReport(String domain, Date start);
public SqlReport querySqlReport(String domain, Date start);
public StateReport queryStateReport(String domain, Date start);
public TransactionReport queryTransactionReport(String domain, Date start);
public boolean insert(WeeklyReport report);
public BugReport queryBugReport(String domain, Date start);
}
package com.dianping.cat.report.service;
import java.util.Date;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.home.bug.entity.BugReport;
import com.dianping.cat.home.service.entity.ServiceReport;
public interface WeeklyReportService {
public boolean insert(WeeklyReport report);
public BugReport queryBugReport(String domain, Date start);
public CrossReport queryCrossReport(String domain, Date start);
public EventReport queryEventReport(String domain, Date start);
public HeartbeatReport queryHeartbeatReport(String domain, Date start);
public MatrixReport queryMatrixReport(String domain, Date start);
public ProblemReport queryProblemReport(String domain, Date start);
public ServiceReport queryServiceReport(String domain, Date start);
public SqlReport querySqlReport(String domain, Date start);
public StateReport queryStateReport(String domain, Date start);
public TransactionReport queryTransactionReport(String domain, Date start);
}
......@@ -7,6 +7,7 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.matrix.MatrixReportFilter;
import com.dianping.cat.consumer.matrix.MatrixReportMerger;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.core.dal.DailyReport;
......@@ -90,6 +91,7 @@ public class MatrixReportBuilder implements ReportTaskBuilder {
}
}
MatrixReport matrixReport = merger.getMatrixReport();
new MatrixReportFilter().visitMatrixReport(matrixReport);
matrixReport.setStartTime(start);
matrixReport.setEndTime(end);
......@@ -110,7 +112,8 @@ public class MatrixReportBuilder implements ReportTaskBuilder {
reportModel.accept(merger);
}
MatrixReport matrixReport = merger.getMatrixReport();
new MatrixReportFilter().visitMatrixReport(matrixReport);
matrixReport.getDomainNames().addAll(domainSet);
matrixReport.setStartTime(start);
matrixReport.setEndTime(end);
......
package com.dianping.cat.report.task.service;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.DomainManager;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.core.dal.DailyReport;
import com.dianping.cat.core.dal.HourlyReport;
import com.dianping.cat.core.dal.MonthlyReport;
import com.dianping.cat.core.dal.WeeklyReport;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.service.entity.Domain;
import com.dianping.cat.home.service.entity.ServiceReport;
import com.dianping.cat.report.page.cross.display.ProjectInfo;
import com.dianping.cat.report.page.cross.display.TypeDetailInfo;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportTaskBuilder;
public class ServiceReportBuilder implements ReportTaskBuilder {
@Inject
protected ReportService m_reportService;
@Inject
private DomainManager m_domainManager;
Map<String, Domain> stat = new HashMap<String, Domain>();
@Override
public boolean buildDailyTask(String name, String domain, Date period) {
ServiceReport serviceReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period));
DailyReport report = new DailyReport();
report.setContent(serviceReport.toString());
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(period);
report.setType(1);
return m_reportService.insertDailyReport(report);
}
@Override
public boolean buildHourlyTask(String name, String domain, Date start) {
ServiceReport serviceReport = new ServiceReport(CatString.CAT);
Date end = new Date(start.getTime() + TimeUtil.ONE_HOUR);
Set<String> domains = m_reportService.queryAllDomainNames(start, end, "cross");
for (String domainName : domains) {
CrossReport crossReport = m_reportService.queryCrossReport(domainName, start, end);
ProjectInfo projectInfo = new ProjectInfo(TimeUtil.ONE_HOUR);
projectInfo.setDomainManager(m_domainManager);
projectInfo.setClientIp(CatString.ALL);
projectInfo.visitCrossReport(crossReport);
Collection<TypeDetailInfo> callInfos = projectInfo.getCallProjectsInfo();
for (TypeDetailInfo typeInfo : callInfos) {
if (!validataService(typeInfo)) {
merge(serviceReport.findOrCreateDomain(typeInfo.getProjectName()), typeInfo);
}
}
}
HourlyReport report = new HourlyReport();
report.setContent(serviceReport.toString());
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(start);
report.setType(1);
return m_reportService.insertHourlyReport(report);
}
public void merge(Domain domain, TypeDetailInfo info) {
domain.setTotalCount(domain.getTotalCount() + info.getTotalCount());
domain.setFailureCount(domain.getFailureCount() + info.getFailureCount());
domain.setSum(domain.getSum() + info.getSum());
if (domain.getTotalCount() > 0) {
domain.setAvg(domain.getSum() / domain.getTotalCount());
domain.setFailurePercent((double) domain.getFailureCount() / domain.getTotalCount());
}
}
private boolean validataService(TypeDetailInfo typeInfo) {
return typeInfo.getProjectName().equalsIgnoreCase(ProjectInfo.ALL_SERVER)
|| typeInfo.getProjectName().equalsIgnoreCase("UnknownProject");
}
public Domain findOrCreate(String project, Map<String, Domain> sdMap) {
Domain d = sdMap.get(project);
if (d == null) {
d = new Domain();
sdMap.put(project, d);
}
return d;
}
@Override
public boolean buildMonthlyTask(String name, String domain, Date period) {
ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period));
MonthlyReport report = new MonthlyReport();
report.setContent(serviceReport.toString());
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(period);
report.setType(1);
return m_reportService.insertMonthlyReport(report);
}
@Override
public boolean buildWeeklyTask(String name, String domain, Date period) {
ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime()
+ TimeUtil.ONE_WEEK));
WeeklyReport report = new WeeklyReport();
String content = serviceReport.toString();
report.setContent(content);
report.setCreationDate(new Date());
report.setDomain(domain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(name);
report.setPeriod(period);
report.setType(1);
return m_reportService.insertWeeklyReport(report);
}
private ServiceReport queryDailyReportsByDuration(String domain, Date start, Date end) {
long startTime = start.getTime();
long endTime = end.getTime();
ServiceReportMerger merger = new ServiceReportMerger(new ServiceReport(domain));
for (; startTime < endTime; startTime += TimeUtil.ONE_DAY) {
try {
ServiceReport reportModel = m_reportService.queryServiceReport(domain, new Date(startTime), new Date(
startTime + TimeUtil.ONE_DAY));
reportModel.accept(merger);
} catch (Exception e) {
Cat.logError(e);
}
}
ServiceReport serviceReport = merger.getServiceReport();
serviceReport.setStartTime(start);
serviceReport.setEndTime(end);
return serviceReport;
}
private ServiceReport queryHourlyReportsByDuration(String name, String domain, Date period, Date endDate) {
long startTime = period.getTime();
long endTime = endDate.getTime();
ServiceReportMerger merger = new ServiceReportMerger(new ServiceReport(domain));
for (; startTime < endTime; startTime = startTime + TimeUtil.ONE_HOUR) {
Date date = new Date(startTime);
ServiceReport reportModel = m_reportService.queryServiceReport(domain, date, new Date(date.getTime()
+ TimeUtil.ONE_HOUR));
reportModel.accept(merger);
}
return merger.getServiceReport();
}
}
......@@ -128,7 +128,7 @@ public class ScheduledMailTask implements Task, LogEnabled {
} catch (Exception e) {
Cat.logError(e);
}
if (mailRecord == null || mailRecord.getCreationDate().getTime() < TimeUtil.getCurrentDay().getTime()) {
List<ScheduledReport> reports = m_scheduledManager.queryScheduledReports();
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册