提交 4caa0277 编写于 作者: Y youyong205

Merge pull request #48 from unidal/biz

rebase from master
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.6.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-consumer-advanced</artifactId>
<name>CAT Consumer - Advanced</name>
<dependencies>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-consumer</artifactId>
</dependency>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-hadoop</artifactId>
</dependency>
<dependency>
<groupId>org.unidal.framework</groupId>
<artifactId>dal-jdbc</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cobar</groupId>
<artifactId>cobar-server</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.unidal.framework</groupId>
<artifactId>test-framework</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.unidal.maven.plugins</groupId>
<artifactId>codegen-maven-plugin</artifactId>
<version>2.0.5</version>
<executions>
<execution>
<id>generate report models</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
</goals>
<configuration>
<manifest>
${basedir}/src/main/resources/META-INF/dal/model/database-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/sql-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/health-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/cross-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/ip-report-manifest.xml,
</manifest>
</configuration>
</execution>
<execution>
<id>generate plexus component descriptor</id>
<phase>process-classes</phase>
<goals>
<goal>plexus</goal>
</goals>
<configuration>
<className>com.dianping.cat.consumer.build.ComponentsConfigurator</className>
<env>dev</env>
</configuration>
</execution>
<execution>
<id>generate dal jdbc model</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-jdbc</goal>
</goals>
<configuration>
<manifest><![CDATA[
${basedir}/src/main/resources/META-INF/dal/jdbc/report-manifest.xml,
]]></manifest>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package com.dianping.cat.consumer;
import org.unidal.initialization.AbstractModule;
import org.unidal.initialization.Module;
import org.unidal.initialization.ModuleContext;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.hadoop.hdfs.DumpUploader;
public class CatConsumerAdvancedModule extends AbstractModule {
public static final String ID = "cat-consumer-advanced";
@Override
protected void execute(ModuleContext ctx) {
ServerConfigManager configManager = ctx.lookup(ServerConfigManager.class);
if (!configManager.isLocalMode()) {
DumpUploader uploader = ctx.lookup(DumpUploader.class);
uploader.start();
}
}
@Override
public Module[] getDependencies(ModuleContext ctx) {
return ctx.getModules(CatConsumerModule.ID);
}
}
package com.dianping.cat.consumer.cross;
package com.dianping.cat.consumer.advanced;
import java.util.Date;
import java.util.HashMap;
......@@ -8,11 +8,13 @@ import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.entity.Local;
import com.dianping.cat.consumer.cross.model.entity.Name;
......@@ -24,13 +26,13 @@ import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.internal.MessageId;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import org.unidal.lookup.annotation.Inject;
public class CrossAnalyzer extends AbstractMessageAnalyzer<CrossReport> implements LogEnabled {
public static final String ID = "cross";
@Inject
private BucketManager m_bucketManager;
......@@ -56,6 +58,7 @@ public class CrossAnalyzer extends AbstractMessageAnalyzer<CrossReport> implemen
return m_reports.keySet();
}
@Override
public CrossReport getReport(String domain) {
CrossReport report = m_reports.get(domain);
......@@ -71,14 +74,7 @@ public class CrossAnalyzer extends AbstractMessageAnalyzer<CrossReport> implemen
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -237,14 +233,6 @@ public class CrossAnalyzer extends AbstractMessageAnalyzer<CrossReport> implemen
}
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.database;
package com.dianping.cat.consumer.advanced;
import java.util.Date;
import java.util.HashMap;
......@@ -8,11 +8,13 @@ import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.database.model.entity.DatabaseReport;
import com.dianping.cat.consumer.database.model.entity.Domain;
import com.dianping.cat.consumer.database.model.entity.Method;
......@@ -23,13 +25,13 @@ import com.dianping.cat.consumer.sql.SqlParseManager;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import org.unidal.lookup.annotation.Inject;
public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> implements LogEnabled {
public static final String ID = "database";
@Inject
private BucketManager m_bucketManager;
......@@ -62,7 +64,7 @@ public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> im
if (connection != null && method != null) {
DatabaseItem item = new DatabaseItem();
String tables = m_sqlParseManeger.getTableNames(sqlName, sqlStatement, domain);
String database = getDataBaseName(connection);
String database = getDatabaseName(connection);
if (database == null) {
database = "Unknown";
......@@ -83,7 +85,7 @@ public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> im
m_logger = logger;
}
public String getDataBaseName(String url) {
String getDatabaseName(String url) {
if (url != null) {
if (url.indexOf("mysql") > -1) {
try {
......@@ -115,6 +117,7 @@ public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> im
return m_reports.keySet();
}
@Override
public DatabaseReport getReport(String domain) {
DatabaseReport report = m_reports.get(domain);
......@@ -130,14 +133,7 @@ public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> im
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -207,14 +203,6 @@ public class DatabaseAnalyzer extends AbstractMessageAnalyzer<DatabaseReport> im
}
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.matrix;
package com.dianping.cat.consumer.advanced;
import java.util.Date;
import java.util.HashMap;
......@@ -11,10 +11,11 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.matrix.model.entity.Matrix;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.matrix.model.entity.Ratio;
......@@ -22,12 +23,13 @@ import com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser;
import com.dianping.cat.consumer.matrix.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class MatrixAnalyzer extends AbstractMessageAnalyzer<MatrixReport> implements LogEnabled {
public static final String ID = "matrix";
@Inject
private BucketManager m_bucketManager;
......@@ -51,6 +53,7 @@ public class MatrixAnalyzer extends AbstractMessageAnalyzer<MatrixReport> implem
return m_reports.keySet();
}
@Override
public MatrixReport getReport(String domain) {
MatrixReport report = m_reports.get(domain);
......@@ -66,14 +69,7 @@ public class MatrixAnalyzer extends AbstractMessageAnalyzer<MatrixReport> implem
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -178,14 +174,6 @@ public class MatrixAnalyzer extends AbstractMessageAnalyzer<MatrixReport> implem
}
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.matrix;
package com.dianping.cat.consumer.advanced;
import java.util.ArrayList;
import java.util.Collection;
......@@ -7,8 +7,9 @@ import java.util.Map;
import com.dianping.cat.consumer.matrix.model.entity.Matrix;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.matrix.model.transform.DefaultXmlBuilder;
public class MatrixReportFilter extends com.dianping.cat.consumer.matrix.model.transform.DefaultXmlBuilder {
public class MatrixReportFilter extends DefaultXmlBuilder {
private String m_domain;
private int m_maxItems;
......
package com.dianping.cat.consumer.metric;
package com.dianping.cat.consumer.advanced;
import java.util.Date;
import java.util.HashMap;
......@@ -11,11 +11,12 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.BusinessReport;
import com.dainping.cat.consumer.dal.report.BusinessReportDao;
import com.dainping.cat.consumer.advanced.dal.BusinessReport;
import com.dainping.cat.consumer.advanced.dal.BusinessReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.CatConstants;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.entity.Point;
import com.dianping.cat.consumer.metric.model.transform.DefaultNativeBuilder;
......@@ -24,12 +25,13 @@ import com.dianping.cat.consumer.metric.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Metric;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implements LogEnabled {
public static final Object ID = "metric";
@Inject
private BucketManager m_bucketManager;
......@@ -98,15 +100,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
return report;
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -181,8 +175,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
}
private void updateChannel(int min, com.dianping.cat.consumer.metric.model.entity.Metric metric, double value) {
com.dianping.cat.consumer.metric.model.entity.Metric detail = metric.findOrCreateMetric(CHANNEL + "="
+(int)(value));
com.dianping.cat.consumer.metric.model.entity.Metric detail = metric.findOrCreateMetric(CHANNEL + "=" + (int) (value));
Point channelPoint = detail.findOrCreatePoint(min);
......@@ -218,7 +211,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
return 0;
}
protected double parseValue(final String key, final String data) {
public double parseValue(final String key, final String data) {
int len = data == null ? 0 : data.length();
int keyLen = key.length();
StringBuilder name = new StringBuilder();
......@@ -277,14 +270,6 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
return count;
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.sql;
package com.dianping.cat.consumer.advanced;
import java.util.Date;
import java.util.HashMap;
......@@ -11,10 +11,12 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.sql.SqlParseManager;
import com.dianping.cat.consumer.sql.model.entity.Database;
import com.dianping.cat.consumer.sql.model.entity.Method;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
......@@ -24,12 +26,13 @@ import com.dianping.cat.consumer.sql.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class SqlAnalyzer extends AbstractMessageAnalyzer<SqlReport> implements LogEnabled {
public static final String ID = "sql";
@Inject
private BucketManager m_bucketManager;
......@@ -122,6 +125,7 @@ public class SqlAnalyzer extends AbstractMessageAnalyzer<SqlReport> implements L
return m_reports.keySet();
}
@Override
public SqlReport getReport(String domain) {
SqlReport report = m_reports.get(domain);
......@@ -137,14 +141,7 @@ public class SqlAnalyzer extends AbstractMessageAnalyzer<SqlReport> implements L
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -218,14 +215,6 @@ public class SqlAnalyzer extends AbstractMessageAnalyzer<SqlReport> implements L
}
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.ip;
package com.dianping.cat.consumer.advanced;
import java.util.ArrayList;
import java.util.Calendar;
......@@ -10,11 +10,13 @@ import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.ip.model.entity.Ip;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.entity.Period;
......@@ -24,13 +26,13 @@ import com.dianping.cat.message.Event;
import com.dianping.cat.message.Heartbeat;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import org.unidal.lookup.annotation.Inject;
public class TopIpAnalyzer extends AbstractMessageAnalyzer<IpReport> implements LogEnabled {
public static final String ID = "ip";
private static final String TOKEN = "RemoteIP=";
@Inject
......@@ -58,6 +60,7 @@ public class TopIpAnalyzer extends AbstractMessageAnalyzer<IpReport> implements
return m_reports.keySet();
}
@Override
public IpReport getReport(String domain) {
IpReport report = m_reports.get(domain);
......@@ -71,14 +74,7 @@ public class TopIpAnalyzer extends AbstractMessageAnalyzer<IpReport> implements
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -202,14 +198,6 @@ public class TopIpAnalyzer extends AbstractMessageAnalyzer<IpReport> implements
return report;
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.build;
import java.util.ArrayList;
import java.util.List;
import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator;
import org.unidal.lookup.configuration.Component;
final class CatAdvancedDatabaseConfigurator extends AbstractJdbcResourceConfigurator {
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(defineJdbcDataSourceConfigurationManagerComponent("datasources.xml"));
all.add(defineJdbcDataSourceComponent("cat", "com.mysql.jdbc.Driver", "jdbc:mysql://192.168.7.43:3306/cat", "dpcom_cat", "password", "<![CDATA[useUnicode=true&autoReconnect=true]]>"));
defineSimpleTableProviderComponents(all, "cat", com.dainping.cat.consumer.advanced.dal._INDEX.getEntityClasses());
defineDaoComponents(all, com.dainping.cat.consumer.advanced.dal._INDEX.getDaoClasses());
return all;
}
}
package com.dianping.cat.consumer.build;
import java.util.ArrayList;
import java.util.List;
import org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager;
import org.unidal.initialization.Module;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dainping.cat.consumer.advanced.dal.BusinessReportDao;
import com.dainping.cat.consumer.advanced.dal.SqltableDao;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.consumer.CatConsumerAdvancedModule;
import com.dianping.cat.consumer.MessageAnalyzer;
import com.dianping.cat.consumer.advanced.CrossAnalyzer;
import com.dianping.cat.consumer.advanced.DatabaseAnalyzer;
import com.dianping.cat.consumer.advanced.MatrixAnalyzer;
import com.dianping.cat.consumer.advanced.MetricAnalyzer;
import com.dianping.cat.consumer.advanced.SqlAnalyzer;
import com.dianping.cat.consumer.advanced.TopIpAnalyzer;
import com.dianping.cat.consumer.sql.SqlParseManager;
import com.dianping.cat.storage.BucketManager;
public class ComponentsConfigurator extends AbstractResourceConfigurator {
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(C(SqlParseManager.class)//
.req(SqltableDao.class));
all.add(C(MessageAnalyzer.class, CrossAnalyzer.ID, CrossAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(MessageAnalyzer.class, DatabaseAnalyzer.ID, DatabaseAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, SqlParseManager.class));
all.add(C(MessageAnalyzer.class, SqlAnalyzer.ID, SqlAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, SqlParseManager.class));
all.add(C(MessageAnalyzer.class, MatrixAnalyzer.ID, MatrixAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(MessageAnalyzer.class, TopIpAnalyzer.ID, TopIpAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(MessageAnalyzer.class, MetricAnalyzer.ID, MetricAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, BusinessReportDao.class));
all.add(C(Module.class, CatConsumerAdvancedModule.ID, CatConsumerAdvancedModule.class));
// database
all.add(C(JdbcDataSourceConfigurationManager.class) //
.config(E("datasourceFile").value("/data/appdatas/cat/datasources.xml")));
all.addAll(new CatAdvancedDatabaseConfigurator().defineComponents());
return all;
}
public static void main(String[] args) {
generatePlexusComponentsXmlFile(new ComponentsConfigurator());
}
}
......@@ -9,9 +9,9 @@ import java.util.Set;
import org.unidal.dal.jdbc.DalException;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Sqltable;
import com.dainping.cat.consumer.dal.report.SqltableDao;
import com.dainping.cat.consumer.dal.report.SqltableEntity;
import com.dainping.cat.consumer.advanced.dal.Sqltable;
import com.dainping.cat.consumer.advanced.dal.SqltableDao;
import com.dainping.cat.consumer.advanced.dal.SqltableEntity;
import com.dianping.cat.Cat;
public class SqlParseManager {
......
<?xml version="1.0" encoding="UTF-8"?>
<entities>
<entity name="business-report" table="businessReport" alias="b">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="type" field="type" value-type="int" length="3" nullable="false" />
<member name="name" field="name" value-type="String" length="20" nullable="false" />
<member name="ip" field="ip" value-type="String" length="20" nullable="false" />
<member name="product-line" field="productLine" value-type="String" length="50" nullable="false" />
<member name="period" field="period" value-type="Date" nullable="false" />
<member name="content" field="content" value-type="byte[]" length="2147483647" />
<member name="creation-date" field="creation_date" value-type="Date" nullable="false" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
<index name="IX_Group_Name_Period" members="productLine ASC, name ASC, period ASC" />
<index name="IX_Name_Period" members="name ASC, period ASC" />
<index name="IX_Period" members="period ASC" />
<readsets>
<readset name="FULL" all="true" />
</readsets>
<updatesets>
<updateset name="FULL" all="true" />
</updatesets>
<query-defs>
<query name="find-by-PK" type="SELECT">
<param name="key-id" />
<statement><![CDATA[SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[INSERT INTO <TABLE/>(<FIELDS/>)
VALUES(<VALUES/>)]]></statement>
</query>
<query name="update-by-PK" type="UPDATE">
<param name="key-id" />
<statement><![CDATA[UPDATE <TABLE/>
SET <FIELDS/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="delete-by-PK" type="DELETE">
<param name="key-id" />
<statement><![CDATA[DELETE FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
</query-defs>
</entity>
<entity name="sqltable" table="sqltable" alias="s">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="domain" field="domain" value-type="String" length="50" />
<member name="sql-name" field="sql_name" value-type="String" length="100" />
<member name="table-name" field="table_name" value-type="String" length="100" />
<member name="sql-statement" field="sql_statement" value-type="String" length="1000" />
<member name="creation-date" field="creation_date" value-type="Date" />
<member name="modify-date" field="modify_date" value-type="Date" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
<readsets>
<readset name="FULL" all="true" />
</readsets>
<updatesets>
<updateset name="FULL" all="true" />
</updatesets>
<query-defs>
<query name="find-by-PK" type="SELECT">
<param name="key-id" />
<statement><![CDATA[SELECT <FIELDS/> FROM <TABLE/> WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[INSERT INTO <TABLE/>(<FIELDS/>) VALUES(<VALUES/>)]]></statement>
</query>
<query name="update-by-PK" type="UPDATE">
<param name="key-id" />
<statement><![CDATA[UPDATE <TABLE/> SET <FIELDS/> WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="delete-by-PK" type="DELETE">
<param name="key-id" />
<statement><![CDATA[DELETE FROM <TABLE/> WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
</query-defs>
</entity>
</entities>
<?xml version="1.0" encoding="UTF-8"?>
<entities do-package="com.dainping.cat.consumer.advanced.dal" gen="true">
<entity name="sqltable">
<member name="creation-date" insert-expr="NOW()" />
<member name="modify-date" insert-expr="NOW()" update-expr="NOW()" />
<query-defs>
<query name="find-all-by-domain" type="SELECT" multiple="true">
<param name="domain" />
<statement><![CDATA[SELECT <FIELDS/> FROM <TABLE/> WHERE <FIELD name='domain'/> = ${domain}]]></statement>
</query>
</query-defs>
</entity>
<entity name="business-report" table="businessReport" alias="b">
<member name="creation-date" insert-expr="NOW()" />
<var name="start-date" value-type="Date" />
<var name="end-date" value-type="Date" />
<query-defs>
<query name="find-all-by-productLine-name-duration" type="SELECT" multiple="true">
<param name="start-date" />
<param name="end-date" />
<param name="product-line" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
AND <FIELD name='product-line'/> = ${product-line}
AND <FIELD name='name'/> = ${name}
]]></statement>
</query>
<query name="find-all-by-period-productLine-name" type="SELECT" multiple="true">
<param name="period" />
<param name="product-line" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='product-line'/> = ${product-line}
AND <FIELD name='name'/> = ${name}
]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[
INSERT
INTO <TABLE/>(<FIELDS/>)
VALUES(<VALUES/>)
]]></statement>
</query>
</query-defs>
</entity>
</entities>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="report-codegen.xml" />
<file path="report-dal.xml" />
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.cross.model" enable-merger="true" enable-json-builder="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true" enable-native-builder="true" enable-native-parser="true">
<entity name="cross-report" root="true">
<attribute name="domain" key="true" />
<element name="domain" value-type="String" type="set" names="domain-names" />
<element name="ip" value-type="String" type="set" names="ips" />
<entity-ref name="local" type="map" names="locals" method-find-or-create="true" />
</entity>
<entity name="local">
<attribute name="id" value-type="String" key="true" />
<entity-ref name="remote" type="map" names="remotes" method-find-or-create="true" />
</entity>
<entity name="remote">
<attribute name="id" value-type="String" key="true" />
<entity-ref name="type" />
</entity>
<entity name="type">
<attribute name="id" value-type="String" />
<attribute name="totalCount" value-type="long" primitive="true" method-inc="true" />
<attribute name="failCount" value-type="int" primitive="true" method-inc="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="avg" value-type="double" primitive="true" format="0.00" />
<attribute name="sum" value-type="double" primitive="true" format="0.00" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
<entity-ref name="name" type="map" names="names" method-find-or-create="true" />
</entity>
<entity name="name">
<attribute name="id" value-type="String" key="true" />
<attribute name="totalCount" value-type="long" primitive="true" method-inc="true" />
<attribute name="failCount" value-type="int" primitive="true" method-inc="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="avg" value-type="double" primitive="true" format="0.00" />
<attribute name="sum" value-type="double" primitive="true" format="0.00" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.database.model" enable-merger="true" enable-json-builder="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true" enable-native-builder="true" enable-native-parser="true">
<entity name="database-report" root="true">
<attribute name="database" value-type="String" key="true" />
<attribute name="connect-url" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="databaseName" value-type="String" type="set" names="databaseNames" />
<element name="domainName" value-type="String" type="set" names="domainNames" />
<entity-ref name="domain" type="map" names="domains" method-find-or-create="true" />
</entity>
<entity name="domain">
<attribute name="id" value-type="String" key="true" />
<entity-ref name="table" type="map" names="tables" method-find-or-create="true" />
</entity>
<entity name="table">
<attribute name="id" value-type="String" key="true" />
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="avg" value-type="double" primitive="true" format="0.00" />
<attribute name="sum" value-type="double" primitive="true" format="0.00" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
<entity-ref name="method" type="map" names="methods" method-find-or-create="true" />
</entity>
<entity name="method">
<attribute name="id" value-type="String" key="true" />
<element name="sql" value-type="String" type="set" names="sqlNames" />
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="avg" value-type="double" primitive="true" format="0.00" />
<attribute name="sum" value-type="double" primitive="true" format="0.00" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.health.model" enable-merger="true" enable-json-builder="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true" enable-native-builder="true" enable-native-parser="true">
<entity name="health-report" root="true">
<attribute name="domain" value-type="String" key="true" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="domain" value-type="String" type="set" names="domainNames" />
<entity-ref name="problem-info" />
<entity-ref name="url" />
<entity-ref name="service" />
<entity-ref name="clientService" />
<entity-ref name="call" />
<entity-ref name="sql" />
<entity-ref name="web-cache" />
<entity-ref name="kvdb-cache" />
<entity-ref name="mem-cache" />
<entity-ref name="machine-info" />
</entity>
<entity name="machine-info">
<attribute name="numbers" value-type="int" primitive="true" />
<attribute name="avg-load" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-load" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-load-count" value-type="int" primitive="true" />
<attribute name="avg-load-sum" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-load-machine" value-type="String" />
<attribute name="avg-oldgc" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-oldgc" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-oldgc-count" value-type="int" primitive="true" />
<attribute name="avg-oldgc-sum" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-oldgc-machine" value-type="String" />
<attribute name="avg-http" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-http" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-http-count" value-type="int" primitive="true" />
<attribute name="avg-http-sum" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-http-machine" value-type="String" />
<attribute name="avg-pigeon" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-pigeon" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-pigeon-count" value-type="int" primitive="true" />
<attribute name="avg-pigeon-sum" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-pigeon-machine" value-type="String" />
<attribute name="avg-memory-used" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-memory-used" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-memory-used-count" value-type="int" primitive="true" />
<attribute name="avg-memory-used-sum" value-type="double" primitive="true" format="0.000000" />
<attribute name="avg-max-memory-used-machine" value-type="String" />
</entity>
<entity name="problem-info">
<attribute name="exceptions" value-type="long" primitive="true" />
<attribute name="longSqls" value-type="long" primitive="true" />
<attribute name="long-sqlPercent" value-type="double" primitive="true" format="0.000000" />
<attribute name="longUrls" value-type="long" primitive="true" />
<attribute name="long-urlPercent" value-type="double" primitive="true" format="0.000000" />
<attribute name="longServices" value-type="long" primitive="true" />
<attribute name="long-servicePercent" value-type="double" primitive="true" format="0.000000" />
<attribute name="longCaches" value-type="long" primitive="true" />
<attribute name="long-cachePercent" value-type="double" primitive="true" format="0.000000" />
</entity>
<entity name="url">
<entity-ref name="base-info" />
</entity>
<entity name="base-info">
<attribute name="total" value-type="long" primitive="true" />
<attribute name="response-time" value-type="double" primitive="true" format="0.00" />
<attribute name="error-total" value-type="long" primitive="true" />
<attribute name="error-percent" value-type="double" primitive="true" format="0.000000" />
<attribute name="success-percent" value-type="double" primitive="true" format="0.000000" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
</entity>
<entity name="service">
<entity-ref name="base-info" />
</entity>
<entity name="clientService">
<entity-ref name="base-info" />
</entity>
<entity name="call">
<entity-ref name="base-info" />
</entity>
<entity name="sql">
<entity-ref name="base-info" />
</entity>
<entity name="web-cache">
<entity-ref name="base-cache-info" />
</entity>
<entity name="base-cache-info">
<attribute name="total" value-type="long" primitive="true" />
<attribute name="response-time" value-type="double" primitive="true" format="0.00" />
<attribute name="hit-percent" value-type="double" primitive="true" format="0.000000" />
</entity>
<entity name="kvdb-cache">
<entity-ref name="base-cache-info" />
</entity>
<entity name="mem-cache">
<entity-ref name="base-cache-info" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.ip.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="ip-report" root="true">
<attribute name="domain" key="true" />
......
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.matrix.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="matrix-report" root="true">
<attribute name="domain" value-type="String" key="true"/>
......
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.sql.model" enable-merger="true" enable-json-builder="true" enable-sax-parser="true"
enable-json-parser="true" enable-base-visitor="true" enable-native-builder="true" enable-native-parser="true">
<entity name="sql-report" root="true">
<attribute name="domain" value-type="String" key="true" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="domainName" value-type="String" type="set" names="domain-names" />
<element name="databaseName" value-type="String" type="set" names="database-names" />
<entity-ref name="database" type="map" names="databases" method-find-or-create="true" />
</entity>
<entity name="database">
<attribute name="id" value-type="String" key="true" />
<attribute name="connect-url" value-type="String" />
<entity-ref name="table" type="map" names="tables" method-find-or-create="true" />
</entity>
<entity name="table">
<attribute name="id" value-type="String" key="true" />
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="avg" value-type="double" primitive="true" format="0.00" />
<attribute name="sum" value-type="double" primitive="true" format="0.00" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
<entity-ref name="method" type="map" names="methods" method-find-or-create="true" />
</entity>
<entity name="method">
<attribute name="id" value-type="String" key="true" />
<element name="sql" value-type="String" type="set" names="sqlNames" />
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00" />
<attribute name="avg" value-type="double" primitive="true" format="0.00" />
<attribute name="sum" value-type="double" primitive="true" format="0.00" />
<attribute name="tps" value-type="double" primitive="true" format="0.00" />
</entity>
</model>
<plexus>
<components>
<component>
<role>com.dianping.cat.consumer.sql.SqlParseManager</role>
<implementation>com.dianping.cat.consumer.sql.SqlParseManager</implementation>
<requirements>
<requirement>
<role>com.dainping.cat.consumer.advanced.dal.SqltableDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.MessageAnalyzer</role>
<role-hint>cross</role-hint>
<implementation>com.dianping.cat.consumer.advanced.CrossAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dainping.cat.consumer.core.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.MessageAnalyzer</role>
<role-hint>database</role-hint>
<implementation>com.dianping.cat.consumer.advanced.DatabaseAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dainping.cat.consumer.core.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.sql.SqlParseManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.MessageAnalyzer</role>
<role-hint>sql</role-hint>
<implementation>com.dianping.cat.consumer.advanced.SqlAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dainping.cat.consumer.core.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.sql.SqlParseManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.MessageAnalyzer</role>
<role-hint>matrix</role-hint>
<implementation>com.dianping.cat.consumer.advanced.MatrixAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dainping.cat.consumer.core.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.MessageAnalyzer</role>
<role-hint>ip</role-hint>
<implementation>com.dianping.cat.consumer.advanced.TopIpAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dainping.cat.consumer.core.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.MessageAnalyzer</role>
<role-hint>metric</role-hint>
<implementation>com.dianping.cat.consumer.advanced.MetricAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dainping.cat.consumer.advanced.dal.BusinessReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>org.unidal.initialization.Module</role>
<role-hint>cat-consumer-advanced</role-hint>
<implementation>com.dianping.cat.consumer.CatConsumerAdvancedModule</implementation>
</component>
<component>
<role>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</role>
<implementation>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</implementation>
<configuration>
<datasourceFile>/data/appdatas/cat/datasources.xml</datasourceFile>
</configuration>
</component>
<component>
<role>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</role>
<implementation>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</implementation>
<configuration>
<datasourceFile>datasources.xml</datasourceFile>
</configuration>
</component>
<component>
<role>org.unidal.dal.jdbc.datasource.DataSource</role>
<role-hint>cat</role-hint>
<implementation>org.unidal.dal.jdbc.datasource.JdbcDataSource</implementation>
<configuration>
<id>cat</id>
<maximum-pool-size>3</maximum-pool-size>
<connection-timeout>1s</connection-timeout>
<idle-timeout>10m</idle-timeout>
<statement-cache-size>1000</statement-cache-size>
<properties>
<driver>com.mysql.jdbc.Driver</driver>
<URL>jdbc:mysql://192.168.7.43:3306/cat</URL>
<user>dpcom_cat</user>
<password>password</password>
<connectionProperties><![CDATA[useUnicode=true&autoReconnect=true]]></connectionProperties>
</properties>
</configuration>
<requirements>
<requirement>
<role>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</role>
</requirement>
</requirements>
</component>
<component>
<role>org.unidal.dal.jdbc.mapping.TableProvider</role>
<role-hint>business-report</role-hint>
<implementation>org.unidal.dal.jdbc.mapping.SimpleTableProvider</implementation>
<configuration>
<logical-table-name>business-report</logical-table-name>
<physical-table-name>businessReport</physical-table-name>
<data-source-name>cat</data-source-name>
</configuration>
</component>
<component>
<role>org.unidal.dal.jdbc.mapping.TableProvider</role>
<role-hint>sqltable</role-hint>
<implementation>org.unidal.dal.jdbc.mapping.SimpleTableProvider</implementation>
<configuration>
<logical-table-name>sqltable</logical-table-name>
<physical-table-name>sqltable</physical-table-name>
<data-source-name>cat</data-source-name>
</configuration>
</component>
<component>
<role>com.dainping.cat.consumer.advanced.dal.BusinessReportDao</role>
<implementation>com.dainping.cat.consumer.advanced.dal.BusinessReportDao</implementation>
<requirements>
<requirement>
<role>org.unidal.dal.jdbc.QueryEngine</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dainping.cat.consumer.advanced.dal.SqltableDao</role>
<implementation>com.dainping.cat.consumer.advanced.dal.SqltableDao</implementation>
<requirements>
<requirement>
<role>org.unidal.dal.jdbc.QueryEngine</role>
</requirement>
</requirements>
</component>
</components>
</plexus>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="wizard.xml" />
</manifest>
<wizard package="com.dianping.cat.consumer">
<jdbc package="com.dainping.cat.consumer.dal" name="CatAdvanced">
<datasource>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://192.168.7.43:3306/cat</url>
<user>dpcom_cat</user>
<password>password</password>
<properties>useUnicode=true&amp;autoReconnect=true</properties>
</datasource>
<group name="report" package="com.dainping.cat.consumer.dal.report">
<table name="sqltable"/>
<table name="businessReport"/>
</group>
</jdbc>
</wizard>
package com.dianping.cat.consumer;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import com.dianping.cat.consumer.advanced.CrossInfoTest;
import com.dianping.cat.consumer.advanced.DatabaseAnalyzerTest;
import com.dianping.cat.consumer.advanced.IpReportTest;
import com.dianping.cat.consumer.advanced.MatrixModelTest;
import com.dianping.cat.consumer.advanced.MetricAnalyzerTest;
import com.dianping.cat.consumer.advanced.SqlParsersTest;
@RunWith(Suite.class)
@SuiteClasses({
CrossInfoTest.class,
DatabaseAnalyzerTest.class,
IpReportTest.class,
MatrixModelTest.class,
SqlParsersTest.class,
DatabaseAnalyzerTest.class,
MetricAnalyzerTest.class
})
public class AllTests {
}
package com.dianping.cat.consumer.cross;
package com.dianping.cat.consumer.advanced;
import junit.framework.Assert;
import org.junit.Test;
import com.dianping.cat.consumer.cross.CrossAnalyzer.CrossInfo;
import com.dianping.cat.consumer.advanced.CrossAnalyzer.CrossInfo;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.DefaultEvent;
import com.dianping.cat.message.internal.DefaultTransaction;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.message.spi.internal.DefaultMessageTree;
public class ParseCrossInfoTest{
public class CrossInfoTest {
@Test
public void testParsePigeonClientTransaction() {
CrossAnalyzer analyzer = new CrossAnalyzer();
......
package com.dianping.cat.consumer.database;
package com.dianping.cat.consumer.advanced;
import junit.framework.Assert;
import org.junit.Test;
public class DatabaseAnalyzerTest {
@Test
public void testParseDatabaseName(){
DatabaseAnalyzer analyzer = new DatabaseAnalyzer();
String mysql="jdbc:mysql://127.0.0.1:3306/cat";
String net ="jdbc:sqlserver://10.1.1.241:1433;xopenStates=false;sendTimeAsDatetime=true;trustServerCertificate=false;sendStringParametersAsUnicode=true;selectMethod=direct;responseBuffering=adaptive;packetSize=8000;loginTimeout=15;lockTimeout=-1;lastUpdateCount=true;encrypt=false;disableStatementPooling=true;databaseName=zSurvey_NET;applicationName=Microsoft SQL Server JDBC Driver;";
String mysqlResult =analyzer.getDataBaseName(mysql);
String netResult = analyzer.getDataBaseName(net);
String mysqlResult =analyzer.getDatabaseName(mysql);
String netResult = analyzer.getDatabaseName(net);
Assert.assertEquals("cat", mysqlResult);
Assert.assertEquals("zSurvey_NET", netResult);
}
}
package com.dianping.cat.consumer.ip;
package com.dianping.cat.consumer.advanced;
import org.junit.Assert;
import org.junit.Test;
import org.unidal.helper.Files;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.transform.DefaultDomParser;
import com.dianping.cat.consumer.ip.model.transform.DefaultJsonBuilder;
import com.dianping.cat.consumer.ip.model.transform.DefaultSaxParser;
import com.dianping.cat.consumer.ip.model.transform.DefaultXmlBuilder;
import org.unidal.helper.Files;
public class IpReportTest {
@Test
public void testXml() throws Exception {
DefaultDomParser parser = new DefaultDomParser();
String source = Files.forIO().readFrom(getClass().getResourceAsStream("IpReport.xml"), "utf-8");
IpReport report = parser.parse(source);
IpReport report = DefaultSaxParser.parse(source);
String xml = new DefaultXmlBuilder().buildXml(report);
String expected = source;
......@@ -23,14 +22,11 @@ public class IpReportTest {
@Test
public void testJson() throws Exception {
DefaultDomParser parser = new DefaultDomParser();
String source = Files.forIO().readFrom(getClass().getResourceAsStream("IpReport.xml"), "utf-8");
IpReport report = parser.parse(source);
IpReport report = DefaultSaxParser.parse(source);
String json = new DefaultJsonBuilder().buildJson(report);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("IpReport.json"), "utf-8");
Assert.assertEquals("XML is not well parsed or JSON is not well built!", expected.replace("\r", ""),
json.replace("\r", ""));
Assert.assertEquals("XML is not well parsed or JSON is not well built!", expected.replace("\r", ""), json.replace("\r", ""));
}
}
package com.dianping.cat.consumer.matrix;
package com.dianping.cat.consumer.advanced;
import junit.framework.Assert;
......@@ -6,28 +6,18 @@ import org.junit.Test;
import org.unidal.helper.Files;
import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.matrix.model.transform.DefaultDomParser;
public class MatrixReportFilterTest {
import com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser;
public class MatrixModelTest {
@Test
public void test() throws Exception {
DefaultDomParser parser = new DefaultDomParser();
public void testModel() throws Exception {
String source = Files.forIO().readFrom(getClass().getResourceAsStream("matrix.xml"), "utf-8");
MatrixReport report = parser.parse(source);
MatrixReport report = DefaultSaxParser.parse(source);
MatrixReportFilter f1 = new MatrixReportFilter(1);
report.accept(f1);
String expected1 = Files.forIO().readFrom(getClass().getResourceAsStream("matrix-result.xml"), "utf-8");
Assert.assertEquals(expected1.replaceAll("\\s*", ""), report.toString().replaceAll("\\s*", ""));
}
@Test
public void test1(){
Long i = Long.MAX_VALUE;
long ii=Long.MAX_VALUE;
System.out.println(i.toString());
System.out.println(ii);
}
}
package com.dianping.cat.consumer.metric;
package com.dianping.cat.consumer.advanced;
import junit.framework.Assert;
import org.junit.Test;
public class MetricAnalyzerTest {
@Test
......@@ -15,6 +16,7 @@ public class MetricAnalyzerTest {
for (int i = 0; i < 10000000; i++) {
analyzer.parseValue("abc", data);
}
System.out.println(System.currentTimeMillis() - t);
Assert.assertEquals(analyzer.parseValue("aaa", "aaa=1.1"), 1.1);
......
package com.dianping.cat.consumer.metric;
package com.dianping.cat.consumer.advanced;
import java.util.Date;
......@@ -8,11 +8,11 @@ import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.BusinessReport;
import com.dainping.cat.consumer.dal.report.BusinessReportDao;
import com.dainping.cat.consumer.dal.report.BusinessReportEntity;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.advanced.dal.BusinessReport;
import com.dainping.cat.consumer.advanced.dal.BusinessReportDao;
import com.dainping.cat.consumer.advanced.dal.BusinessReportEntity;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.transform.DefaultNativeBuilder;
import com.dianping.cat.consumer.metric.model.transform.DefaultNativeParser;
......
package com.dianping.cat.consumer.advanced;
import java.util.Arrays;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import com.dianping.cat.consumer.sql.SqlParsers;
public class SqlParsersTest {
private void checkTables(String sql, String... expectedTables) {
List<String> tables = SqlParsers.forTable().parse(sql);
Assert.assertEquals(Arrays.asList(expectedTables).toString(), tables.toString());
}
@Test
public void testParseTables() {
checkTables("select * from table1", "table1");
checkTables("update table2 set col =1", "table2");
checkTables("insert into table3 (column1) values(1)", "table3");
checkTables("delete from table4", "table4");
checkTables("select r.id,r.name,r.des from resource r where r.id in "
+ "(select resource_id from resource_role where role_id=?)", "resource", "resource_role");
}
}
......@@ -6,15 +6,16 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.AnalyzerFactory;
import com.dianping.cat.consumer.MessageAnalyzer;
import com.dianping.cat.consumer.MessageAnalyzerManager;
import com.dianping.cat.hadoop.hdfs.DumpUploader;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.internal.DefaultTransaction;
import com.dianping.cat.message.io.DefaultMessageQueue;
import com.dianping.cat.message.spi.MessageAnalyzer;
import com.dianping.cat.message.spi.internal.DefaultMessageTree;
import org.unidal.lookup.ComponentTestCase;
@RunWith(JUnit4.class)
public class DumpUploaderSample extends ComponentTestCase {
......@@ -27,7 +28,7 @@ public class DumpUploaderSample extends ComponentTestCase {
@Test
public void testUpload() throws Exception {
AnalyzerFactory factory = lookup(AnalyzerFactory.class);
MessageAnalyzerManager manager = lookup(MessageAnalyzerManager.class);
long now = System.currentTimeMillis();
int num = 10000;
DefaultMessageQueue queue = new DefaultMessageQueue(num);
......@@ -36,16 +37,16 @@ public class DumpUploaderSample extends ComponentTestCase {
queue.offer(newMessageTree(i, now + i * 10L));
}
MessageAnalyzer analyzer = factory.create("dump", now, 10 * 1000L, 10 * 1000L);
MessageAnalyzer analyzer = manager.getAnalyzer("dump", now);
analyzer.analyze(queue);
analyzer.doCheckpoint(true);
System.out.println("checkpoint");
((DumpAnalyzer) analyzer).getDumpUploader().setSleepPeriod(0);
DumpUploader uploader = lookup(DumpUploader.class);
uploader.setSleepPeriod(0);
Thread.sleep(30 * 100 * 1000);
}
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.cross.CrossAnalyzer;
import com.dianping.cat.consumer.advanced.CrossAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.database.DatabaseAnalyzer;
import com.dianping.cat.consumer.advanced.DatabaseAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.event.EventAnalyzer;
import com.dianping.cat.consumer.core.EventAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.matrix.MatrixAnalyzer;
import com.dianping.cat.consumer.advanced.MatrixAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.metric.MetricAnalyzer;
import com.dianping.cat.consumer.advanced.MetricAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.problem.ProblemAnalyzer;
import com.dianping.cat.consumer.core.ProblemAnalyzer;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.DefaultEvent;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.sql.SqlAnalyzer;
import com.dianping.cat.consumer.advanced.SqlAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -2,7 +2,7 @@ package com.dianping.cat.consumer.performance;
import org.junit.Test;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.consumer.core.TransactionAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.MockMessageBuilder;
import com.dianping.cat.message.spi.MessageTree;
......
......@@ -11,18 +11,13 @@
<dependencies>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-hadoop</artifactId>
<artifactId>cat-core</artifactId>
</dependency>
<dependency>
<groupId>org.unidal.framework</groupId>
<artifactId>dal-jdbc</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cobar</groupId>
<artifactId>cobar-server</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.unidal.framework</groupId>
<artifactId>test-framework</artifactId>
......@@ -54,19 +49,15 @@
<goal>dal-model</goal>
</goals>
<configuration>
<manifest>${basedir}/src/main/resources/META-INF/dal/model/database-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/sql-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/health-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/cross-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml,
<manifest>
${basedir}/src/main/resources/META-INF/dal/model/heartbeat-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/problem-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/event-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/ip-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/state-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/top-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/metric-report-manifest.xml,</manifest>
${basedir}/src/main/resources/META-INF/dal/model/metric-report-manifest.xml,
</manifest>
</configuration>
</execution>
<execution>
......@@ -92,16 +83,6 @@
]]></manifest>
</configuration>
</execution>
<execution>
<id>generate dal model files</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
</goals>
<configuration>
<manifest><![CDATA[${basedir}/src/main/resources/META-INF/dal/model/metric-report-manifest.xml,]]></manifest>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
......
package com.dianping.cat.message.spi;
package com.dianping.cat.consumer;
import java.util.HashSet;
import java.util.Set;
......@@ -9,12 +9,13 @@ import org.unidal.lookup.ContainerHolder;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.MessageQueue;
import com.dianping.cat.message.spi.MessageTree;
public abstract class AbstractMessageAnalyzer<R> extends ContainerHolder implements MessageAnalyzer {
public static final long MINUTE = 60 * 1000L;
protected static final long MINUTE = 60 * 1000;
protected long m_extraTime;
private long m_extraTime;
protected long m_startTime;
......@@ -77,15 +78,39 @@ public abstract class AbstractMessageAnalyzer<R> extends ContainerHolder impleme
}
}
protected boolean isActive() {
synchronized (this) {
return m_active;
}
@Override
public void destroy() {
super.release(this);
}
public void shutdown() {
@Override
public void doCheckpoint(boolean atEnd) {
// override it
}
protected long getExtraTime() {
return m_extraTime;
}
public abstract R getReport(String domain);
@Override
public long getStartTime() {
return m_startTime;
}
@Override
public void initialize(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
protected boolean isActive() {
synchronized (this) {
m_active = false;
return m_active;
}
}
......@@ -95,10 +120,19 @@ public abstract class AbstractMessageAnalyzer<R> extends ContainerHolder impleme
return manager.isLocalMode();
}
public void doCheckpoint(boolean atEnd) {
// override it
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
protected void loadReports() {
// to be overridden
}
protected abstract void process(MessageTree tree);
protected boolean shouldDiscard(Transaction t) {
// pigeon default heartbeat is no use
String type = t.getType();
......@@ -110,9 +144,9 @@ public abstract class AbstractMessageAnalyzer<R> extends ContainerHolder impleme
return false;
}
public abstract R getReport(String domain);
protected abstract boolean isTimeout();
protected abstract void process(MessageTree tree);
public void shutdown() {
synchronized (this) {
m_active = false;
}
}
}
package com.dianping.cat.consumer;
import com.dianping.cat.message.spi.MessageAnalyzer;
public interface AnalyzerFactory {
public MessageAnalyzer create(String name, long start, long duration, long extraTime);
public void release(Object component);
}
\ No newline at end of file
package com.dianping.cat.consumer;
import com.dianping.cat.CatCoreModule;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.message.io.TcpSocketReceiver;
import org.unidal.initialization.AbstractModule;
import org.unidal.initialization.Module;
import org.unidal.initialization.ModuleContext;
import com.dianping.cat.CatCoreModule;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.message.io.TcpSocketReceiver;
public class CatConsumerModule extends AbstractModule {
public static final String ID = "cat-consumer";
......
package com.dianping.cat.consumer;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.configuration.ServerConfigManager;
public class Coordinator {
@Inject
private ServerConfigManager m_manager;
private ReadWriteLock m_lock = new ReentrantReadWriteLock();
private Lock m_parallel = m_lock.readLock();
private Lock m_serial = m_lock.writeLock();
public void acquireWrite() throws InterruptedException {
boolean isSerial = m_manager.isSerialWrite();
if (isSerial) {
m_serial.lock();
} else {
m_parallel.lock();
}
}
public void releaseWrite() {
boolean isSerial = m_manager.isSerialWrite();
if (isSerial) {
m_serial.unlock();
} else {
m_parallel.unlock();
}
}
}
package com.dianping.cat.consumer;
import org.unidal.lookup.ContainerHolder;
import com.dianping.cat.consumer.cross.CrossAnalyzer;
import com.dianping.cat.consumer.database.DatabaseAnalyzer;
import com.dianping.cat.consumer.dump.DumpAnalyzer;
import com.dianping.cat.consumer.event.EventAnalyzer;
import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer;
import com.dianping.cat.consumer.ip.TopIpAnalyzer;
import com.dianping.cat.consumer.matrix.MatrixAnalyzer;
import com.dianping.cat.consumer.metric.MetricAnalyzer;
import com.dianping.cat.consumer.problem.ProblemAnalyzer;
import com.dianping.cat.consumer.sql.SqlAnalyzer;
import com.dianping.cat.consumer.state.StateAnalyzer;
import com.dianping.cat.consumer.top.TopAnalyzer;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.message.spi.MessageAnalyzer;
public class DefaultAnalyzerFactory extends ContainerHolder implements AnalyzerFactory {
@Override
public MessageAnalyzer create(String name, long start, long duration, long extraTime) {
if (name.equals("problem")) {
ProblemAnalyzer analyzer = lookup(ProblemAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("transaction")) {
TransactionAnalyzer analyzer = lookup(TransactionAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("event")) {
EventAnalyzer analyzer = lookup(EventAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("dump")) {
DumpAnalyzer analyzer = lookup(DumpAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("ip")) {
TopIpAnalyzer analyzer = lookup(TopIpAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("heartbeat")) {
HeartbeatAnalyzer analyzer = lookup(HeartbeatAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("matrix")) {
MatrixAnalyzer analyzer = lookup(MatrixAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("cross")) {
CrossAnalyzer analyzer = lookup(CrossAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("database")) {
DatabaseAnalyzer analyzer = lookup(DatabaseAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("sql")) {
SqlAnalyzer analyzer = lookup(SqlAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("state")) {
StateAnalyzer analyzer = lookup(StateAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("top")) {
TopAnalyzer analyzer = lookup(TopAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
} else if (name.equals("metric")) {
MetricAnalyzer analyzer = lookup(MetricAnalyzer.class);
analyzer.setAnalyzerInfo(start, duration, extraTime);
return analyzer;
}
throw new RuntimeException(String.format("No analyzer(%s) found!", name));
}
@Override
public void release(Object component) {
super.release(component);
}
}
package com.dianping.cat.consumer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.lookup.ContainerHolder;
public class DefaultMessageAnalyzerManager extends ContainerHolder implements MessageAnalyzerManager, Initializable {
private static final long MINUTE = 60 * 1000L;
private long m_duration = 60 * MINUTE;
private long m_extraTime = 3 * MINUTE;
private List<String> m_analyzerNames;
private Map<Long, Map<String, MessageAnalyzer>> m_map = new HashMap<Long, Map<String, MessageAnalyzer>>();
@Override
public MessageAnalyzer getAnalyzer(String name, long startTime) {
Map<String, MessageAnalyzer> map = m_map.get(startTime);
if (map == null) {
synchronized (m_map) {
if (map == null) {
map = new HashMap<String, MessageAnalyzer>();
m_map.put(startTime, map);
}
}
}
MessageAnalyzer analyzer = map.get(name);
if (analyzer == null) {
synchronized (map) {
if (analyzer == null) {
analyzer = lookup(MessageAnalyzer.class, name);
analyzer.initialize(startTime, m_duration, m_extraTime);
map.put(name, analyzer);
}
}
}
return analyzer;
}
@Override
public List<String> getAnalyzerNames() {
return m_analyzerNames;
}
@Override
public void initialize() throws InitializationException {
Map<String, MessageAnalyzer> map = lookupMap(MessageAnalyzer.class);
for (MessageAnalyzer analyzer : map.values()) {
analyzer.destroy();
}
m_analyzerNames = new ArrayList<String>(map.keySet());
}
}
package com.dianping.cat.message.spi;
package com.dianping.cat.consumer;
import java.util.Set;
import com.dianping.cat.message.spi.MessageQueue;
public interface MessageAnalyzer {
public void analyze(MessageQueue queue);
public void destroy();
public void doCheckpoint(boolean atEnd);
public Set<String> getDomains();
public long getStartTime();
public void initialize(long startTime, long duration, long extraTime);
}
package com.dianping.cat.consumer;
import java.util.List;
public interface MessageAnalyzerManager {
public List<String> getAnalyzerNames();
public MessageAnalyzer getAnalyzer(String name, long startTime);
}
package com.dianping.cat.consumer;
public class PeriodStrategy {
private long m_duration;
private long m_extraTime;
private long m_aheadTime;
private long m_lastStartTime;
private long m_lastEndTime;
public PeriodStrategy(long duration, long extraTime, long aheadTime) {
m_duration = duration;
m_extraTime = extraTime;
m_aheadTime = aheadTime;
m_lastStartTime = -1;
m_lastEndTime = 0;
}
public long getDuration() {
return m_duration;
}
public long next(long now) {
long startTime = now - now % m_duration;
// for current period
if (startTime > m_lastStartTime) {
m_lastStartTime = startTime;
return startTime;
}
// prepare next period ahead
if (now - m_lastStartTime >= m_duration - m_aheadTime) {
m_lastStartTime = startTime + m_duration;
return startTime + m_duration;
}
// last period is over
if (now - m_lastEndTime >= m_duration + m_extraTime) {
long lastEndTime = m_lastEndTime;
m_lastEndTime = startTime;
return -lastEndTime;
}
return 0;
}
}
\ No newline at end of file
package com.dianping.cat.consumer;
import java.util.Calendar;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.helper.Threads.Task;
import com.dianping.cat.Cat;
import com.dianping.cat.CatConstants;
import com.dianping.cat.message.spi.MessageQueue;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.status.ServerStateManager;
public class PeriodTask implements Task, LogEnabled {
private ServerStateManager m_serverStateManager;
private MessageAnalyzer m_analyzer;
private MessageQueue m_queue;
private long m_startTime;
private int m_queueOverflow;
private Logger m_logger;
public PeriodTask(ServerStateManager serverStateManager, MessageAnalyzer analyzer, MessageQueue queue, long startTime) {
m_serverStateManager = serverStateManager;
m_analyzer = analyzer;
m_queue = queue;
m_startTime = startTime;
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
public boolean enqueue(MessageTree tree) {
boolean result = m_queue.offer(tree);
if (!result) { // trace queue overflow
m_queueOverflow++;
if (m_queueOverflow % CatConstants.ERROR_COUNT == 0) {
m_serverStateManager.addMessageTotalLoss(CatConstants.ERROR_COUNT);
m_logger.warn(m_analyzer.getClass().getSimpleName() + " queue overflow number " + m_queueOverflow);
}
}
return result;
}
public void finish() {
try {
m_analyzer.doCheckpoint(true);
} finally {
m_analyzer.destroy();
}
}
public MessageAnalyzer getAnalyzer() {
return m_analyzer;
}
@Override
public String getName() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(m_startTime);
return m_analyzer.getClass().getSimpleName() + "-" + cal.get(Calendar.HOUR_OF_DAY);
}
@Override
public void run() {
try {
m_analyzer.analyze(m_queue);
} catch (Exception e) {
Cat.logError(e);
}
}
@Override
public void shutdown() {
if (m_analyzer instanceof AbstractMessageAnalyzer) {
((AbstractMessageAnalyzer<?>) m_analyzer).shutdown();
}
}
}
\ No newline at end of file
......@@ -3,7 +3,6 @@ package com.dianping.cat.consumer;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
......@@ -16,7 +15,6 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Splitters;
import org.unidal.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.ContainerHolder;
......@@ -24,51 +22,34 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.CatConstants;
import com.dianping.cat.consumer.problem.ProblemAnalyzer;
import com.dianping.cat.consumer.top.TopAnalyzer;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.consumer.core.ProblemAnalyzer;
import com.dianping.cat.consumer.core.TopAnalyzer;
import com.dianping.cat.consumer.core.TransactionAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.MessageProducer;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.io.DefaultMessageQueue;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageAnalyzer;
import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.message.spi.MessageQueue;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.status.ServerStateManager;
/* <p>
*
* @author yong.you
* @since Jan 5, 2012
*/
public class RealtimeConsumer extends ContainerHolder implements MessageConsumer, Initializable, LogEnabled {
private static final long MINUTE = 60 * 1000L;
private static final long FIVE_MINUTES = 5 * MINUTE;
private static final long HOUR = 60 * MINUTE;
public static final String ID = "realtime";
@Inject
private AnalyzerFactory m_factory;
private MessageAnalyzerManager m_analyzerManager;
@Inject
private long m_duration = 1 * HOUR;
@Inject
private long m_extraTime = FIVE_MINUTES;
private ServerStateManager m_serverStateManager;
@Inject
private Coordinator m_coordinator;
private static final long MINUTE = 60 * 1000L;
@Inject
private ServerStateManager m_serverStateManager;
private long m_duration = 60 * MINUTE;
@Inject
private List<String> m_analyzerNames;
private Set<String> m_domains = new HashSet<String>();
private long m_extraTime = 3 * MINUTE;
private Map<String, Integer> m_errorTimeDomains = new HashMap<String, Integer>();
......@@ -76,8 +57,6 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
private PeriodManager m_periodManager;
private CountDownLatch m_latch;
private long m_networkError;
private static int QUEUE_SIZE = 500000;
......@@ -85,7 +64,7 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
@Override
public void consume(MessageTree tree) {
try {
m_latch.await();
m_periodManager.waitUntilStarted();
} catch (InterruptedException e) {
// ignore it
}
......@@ -95,14 +74,9 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
if (period != null) {
period.distribute(tree);
String domain = tree.getDomain();
if (!m_domains.contains(domain)) {
m_domains.add(domain);
}
} else {
m_serverStateManager.addNetworkTimeError(1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
String domain = tree.getDomain();
Integer size = m_errorTimeDomains.get(domain);
......@@ -112,14 +86,14 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
} else {
size++;
}
m_errorTimeDomains.put(domain, size);
m_errorTimeDomains.put(domain, size);
m_networkError++;
if (m_networkError % (CatConstants.ERROR_COUNT * 10) == 0) {
m_logger.error("Error network time:" + m_errorTimeDomains);
m_logger.error("The timestamp of message is out of range, IGNORED! "
+ sdf.format(new Date(tree.getMessage().getTimestamp())) + " " + tree.getDomain() + " "
+ tree.getIpAddress());
+ sdf.format(new Date(tree.getMessage().getTimestamp())) + " " + tree.getDomain() + " " + tree.getIpAddress());
}
}
}
......@@ -156,11 +130,6 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
m_logger = logger;
}
@Override
public String getConsumerId() {
return "realtime";
}
public MessageAnalyzer getCurrentAnalyzer(String name) {
long currentStartTime = getCurrentStartTime();
Period period = m_periodManager.findPeriod(currentStartTime);
......@@ -184,20 +153,11 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
@Override
public void initialize() throws InitializationException {
m_latch = new CountDownLatch(1);
m_periodManager = new PeriodManager(m_latch);
m_periodManager = new PeriodManager();
Threads.forGroup("Cat").start(m_periodManager);
}
public void setAnalyzers(String analyzers) {
m_analyzerNames = Splitters.by(',').noEmptyItem().trim().split(analyzers);
}
public void setExtraTime(long time) {
m_extraTime = time;
}
class Period {
private long m_startTime;
......@@ -206,16 +166,18 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
private List<PeriodTask> m_tasks;
public Period(long startTime, long endTime) {
List<String> names = m_analyzerManager.getAnalyzerNames();
m_startTime = startTime;
m_endTime = endTime;
m_tasks = new ArrayList<PeriodTask>(m_analyzerNames.size());
m_tasks = new ArrayList<PeriodTask>(names.size());
Map<String, MessageAnalyzer> analyzers = new HashMap<String, MessageAnalyzer>();
for (String name : m_analyzerNames) {
MessageAnalyzer analyzer = m_factory.create(name, startTime, m_duration, m_extraTime);
for (String name : names) {
MessageAnalyzer analyzer = m_analyzerManager.getAnalyzer(name, startTime);
MessageQueue queue = new DefaultMessageQueue(QUEUE_SIZE);
PeriodTask task = new PeriodTask(m_factory, analyzer, queue, startTime);
PeriodTask task = new PeriodTask(m_serverStateManager, analyzer, queue, startTime);
analyzers.put(name, analyzer);
task.enableLogging(m_logger);
......@@ -223,12 +185,14 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
}
// hack for dependency
MessageAnalyzer top = analyzers.get("top");
MessageAnalyzer transaction = analyzers.get("transaction");
MessageAnalyzer problem = analyzers.get("problem");
MessageAnalyzer top = analyzers.get(TopAnalyzer.ID);
MessageAnalyzer transaction = analyzers.get(TransactionAnalyzer.ID);
MessageAnalyzer problem = analyzers.get(ProblemAnalyzer.ID);
((TopAnalyzer) top).setTransactionAnalyzer((TransactionAnalyzer) transaction);
((TopAnalyzer) top).setProblemAnalyzer((ProblemAnalyzer) problem);
if (top != null) {
((TopAnalyzer) top).setTransactionAnalyzer((TransactionAnalyzer) transaction);
((TopAnalyzer) top).setProblemAnalyzer((ProblemAnalyzer) problem);
}
}
public void distribute(MessageTree tree) {
......@@ -272,7 +236,8 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
}
public MessageAnalyzer getAnalyzer(String name) {
int index = m_analyzerNames.indexOf(name);
List<String> names = m_analyzerManager.getAnalyzerNames();
int index = names.indexOf(name);
if (index >= 0) {
PeriodTask task = m_tasks.get(index);
......@@ -300,8 +265,8 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
public void start() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
m_logger.info(String.format("Starting %s tasks in period [%s, %s]", m_tasks.size(),
df.format(new Date(m_startTime)), df.format(new Date(m_endTime - 1))));
m_logger.info(String.format("Starting %s tasks in period [%s, %s]", m_tasks.size(), df.format(new Date(m_startTime)),
df.format(new Date(m_endTime - 1))));
for (PeriodTask task : m_tasks) {
Threads.forGroup("Cat-RealtimeConsumer").start(task);
......@@ -318,10 +283,14 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
private CountDownLatch m_latch;
public PeriodManager(CountDownLatch latch) {
m_strategy = new PeriodStrategy(m_duration, m_extraTime, 3 * MINUTE);
public PeriodManager() {
m_strategy = new PeriodStrategy(m_duration, m_extraTime, m_extraTime);
m_active = true;
m_latch = latch;
m_latch = new CountDownLatch(1);
}
public void waitUntilStarted() throws InterruptedException {
m_latch.await();
}
private void endPeriod(long startTime) {
......@@ -358,32 +327,36 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
long startTime = m_strategy.next(System.currentTimeMillis());
// for current period
startPeriod(startTime);
m_latch.countDown();
while (m_active) {
try {
long now = System.currentTimeMillis();
long value = m_strategy.next(now);
if (value == 0) {
// do nothing here
} else if (value > 0) {
// prepare next period in ahead of 3 minutes
startPeriod(value);
} else {
// last period is over
endPeriod(-value);
try {
startPeriod(startTime);
m_latch.countDown();
while (m_active) {
try {
long now = System.currentTimeMillis();
long value = m_strategy.next(now);
if (value == 0) {
// do nothing here
} else if (value > 0) {
// prepare next period in ahead of 3 minutes
startPeriod(value);
} else {
// last period is over
endPeriod(-value);
}
} catch (Throwable e) {
Cat.logError(e);
}
} catch (Throwable e) {
Cat.logError(e);
}
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
break;
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
break;
}
}
} catch (Exception e) {
Cat.logError(e);
}
}
......@@ -393,140 +366,11 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
}
private void startPeriod(long startTime) {
long endTime = startTime + m_duration;
long endTime = startTime + m_strategy.getDuration();
Period period = new Period(startTime, endTime);
m_periods.add(period);
period.start();
}
}
public class PeriodStrategy {
private long m_duration;
private long m_extraTime;
private long m_aheadTime;
private long m_lastStartTime;
private long m_lastEndTime;
public PeriodStrategy(long duration, long extraTime, long aheadTime) {
m_duration = duration;
m_extraTime = extraTime;
m_aheadTime = aheadTime;
m_lastStartTime = -1;
m_lastEndTime = 0;
}
public long next(long now) {
long startTime = now - now % m_duration;
// for current period
if (startTime > m_lastStartTime) {
m_lastStartTime = startTime;
return startTime;
}
// prepare next period ahead
if (now - m_lastStartTime >= m_duration - m_aheadTime) {
m_lastStartTime = startTime + m_duration;
return startTime + m_duration;
}
// last period is over
if (now - m_lastEndTime >= m_duration + m_extraTime) {
long lastEndTime = m_lastEndTime;
m_lastEndTime = startTime;
return -lastEndTime;
}
return 0;
}
}
public class PeriodTask implements Task, LogEnabled {
private AnalyzerFactory m_factory;
private MessageAnalyzer m_analyzer;
private MessageQueue m_queue;
private long m_startTime;
private int m_queueOverflow;
private Logger m_logger;
public PeriodTask(AnalyzerFactory factory, MessageAnalyzer analyzer, MessageQueue queue, long startTime) {
m_factory = factory;
m_analyzer = analyzer;
m_queue = queue;
m_startTime = startTime;
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
public boolean enqueue(MessageTree tree) {
boolean result = m_queue.offer(tree);
if (!result) { // trace queue overflow
m_queueOverflow++;
int count = m_queueOverflow % CatConstants.ERROR_COUNT;
if (count == 0) {
m_serverStateManager.addMessageTotalLoss(CatConstants.ERROR_COUNT);
if (count % 10 == 0) {
m_logger.warn(m_analyzer.getClass().getSimpleName() + " queue overflow number " + m_queueOverflow);
}
}
}
return result;
}
public void finish() {
try {
m_coordinator.acquireWrite();
m_analyzer.doCheckpoint(true);
} catch (InterruptedException e) {
Cat.logError(e);
} finally {
m_coordinator.releaseWrite();
m_factory.release(m_analyzer);
m_factory.release(m_queue);
}
}
public MessageAnalyzer getAnalyzer() {
return m_analyzer;
}
@Override
public String getName() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(m_startTime);
return m_analyzer.getClass().getSimpleName() + "-" + cal.get(Calendar.HOUR_OF_DAY);
}
@Override
public void run() {
try {
m_analyzer.analyze(m_queue);
} catch (Exception e) {
Cat.logError(e);
}
}
@Override
public void shutdown() {
if (m_analyzer instanceof AbstractMessageAnalyzer) {
((AbstractMessageAnalyzer<?>) m_analyzer).shutdown();
}
}
}
}
\ No newline at end of file
......@@ -6,15 +6,15 @@ import java.util.List;
import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator;
import org.unidal.lookup.configuration.Component;
final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator {
final class CatCoreDatabaseConfigurator extends AbstractJdbcResourceConfigurator {
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(defineJdbcDataSourceComponent("cat", "com.mysql.jdbc.Driver", "jdbc:mysql://192.168.7.43:3306/cat", "dpcom_cat", "password", "<![CDATA[useUnicode=true&autoReconnect=true]]>"));
defineSimpleTableProviderComponents(all, "cat", com.dainping.cat.consumer.dal.report._INDEX.getEntityClasses());
defineDaoComponents(all, com.dainping.cat.consumer.dal.report._INDEX.getDaoClasses());
defineSimpleTableProviderComponents(all, "cat", com.dainping.cat.consumer.core.dal._INDEX.getEntityClasses());
defineDaoComponents(all, com.dainping.cat.consumer.core.dal._INDEX.getDaoClasses());
return all;
}
......
......@@ -8,37 +8,26 @@ import org.unidal.initialization.Module;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dainping.cat.consumer.dal.report.BusinessReportDao;
import com.dainping.cat.consumer.dal.report.HostinfoDao;
import com.dainping.cat.consumer.dal.report.ProjectDao;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.SqltableDao;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dainping.cat.consumer.core.dal.HostinfoDao;
import com.dainping.cat.consumer.core.dal.ProjectDao;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dainping.cat.consumer.core.dal.TaskDao;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.AnalyzerFactory;
import com.dianping.cat.consumer.CatConsumerModule;
import com.dianping.cat.consumer.Coordinator;
import com.dianping.cat.consumer.DefaultAnalyzerFactory;
import com.dianping.cat.consumer.DefaultMessageAnalyzerManager;
import com.dianping.cat.consumer.MessageAnalyzer;
import com.dianping.cat.consumer.MessageAnalyzerManager;
import com.dianping.cat.consumer.RealtimeConsumer;
import com.dianping.cat.consumer.cross.CrossAnalyzer;
import com.dianping.cat.consumer.database.DatabaseAnalyzer;
import com.dianping.cat.consumer.dump.DumpAnalyzer;
import com.dianping.cat.consumer.dump.DumpUploader;
import com.dianping.cat.consumer.event.EventAnalyzer;
import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer;
import com.dianping.cat.consumer.ip.TopIpAnalyzer;
import com.dianping.cat.consumer.matrix.MatrixAnalyzer;
import com.dianping.cat.consumer.metric.MetricAnalyzer;
import com.dianping.cat.consumer.problem.ProblemAnalyzer;
import com.dianping.cat.consumer.problem.handler.DefaultProblemHandler;
import com.dianping.cat.consumer.problem.handler.Handler;
import com.dianping.cat.consumer.problem.handler.LongExecutionHandler;
import com.dianping.cat.consumer.sql.SqlAnalyzer;
import com.dianping.cat.consumer.sql.SqlParseManager;
import com.dianping.cat.consumer.state.StateAnalyzer;
import com.dianping.cat.consumer.top.TopAnalyzer;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.hadoop.hdfs.FileSystemManager;
import com.dianping.cat.consumer.core.DumpAnalyzer;
import com.dianping.cat.consumer.core.EventAnalyzer;
import com.dianping.cat.consumer.core.HeartbeatAnalyzer;
import com.dianping.cat.consumer.core.ProblemAnalyzer;
import com.dianping.cat.consumer.core.StateAnalyzer;
import com.dianping.cat.consumer.core.TopAnalyzer;
import com.dianping.cat.consumer.core.TransactionAnalyzer;
import com.dianping.cat.consumer.core.problem.DefaultProblemHandler;
import com.dianping.cat.consumer.core.problem.LongExecutionProblemHandler;
import com.dianping.cat.consumer.core.problem.ProblemHandler;
import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.status.ServerStateManager;
import com.dianping.cat.storage.BucketManager;
......@@ -50,80 +39,49 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(C(Coordinator.class).req(ServerConfigManager.class));
all.add(C(MessageAnalyzerManager.class, DefaultMessageAnalyzerManager.class));
all.add(C(AnalyzerFactory.class, DefaultAnalyzerFactory.class));
all.add(C(MessageConsumer.class, RealtimeConsumer.ID, RealtimeConsumer.class) //
.req(MessageAnalyzerManager.class, ServerStateManager.class));
all.add(C(SqlParseManager.class, SqlParseManager.class)//
.req(SqltableDao.class));
all.add(C(ProblemHandler.class, DefaultProblemHandler.ID, DefaultProblemHandler.class)//
.config(E("failureType").value("URL,SQL,Call,PigeonCall,Cache"))//
.config(E("errorType").value("Error,RuntimeException,Exception")));
all.add(C(MessageConsumer.class, "realtime", RealtimeConsumer.class) //
.req(AnalyzerFactory.class, ServerStateManager.class, Coordinator.class) //
.config(E("extraTime").value(property("extraTime", "180000"))//
, E("analyzers").value("problem,transaction,event,heartbeat,matrix,cross,database,sql,state,top,metric,dump")));
String errorTypes = "Error,RuntimeException,Exception";
String failureTypes = "URL,SQL,Call,PigeonCall,Cache";
all.add(C(Handler.class, "DefaultHandler", DefaultProblemHandler.class)//
.config(E("failureType").value(failureTypes))//
.config(E("errorType").value(errorTypes)));
all.add(C(Handler.class, "LongHandler", LongExecutionHandler.class) //
all.add(C(ProblemHandler.class, LongExecutionProblemHandler.ID, LongExecutionProblemHandler.class) //
.req(ServerConfigManager.class));
all.add(C(ProblemAnalyzer.class).is(PER_LOOKUP) //
all.add(C(MessageAnalyzer.class, ProblemAnalyzer.ID, ProblemAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, TaskDao.class) //
.req(Handler.class, new String[] { "DefaultHandler", "LongHandler" }, "m_handlers"));
.req(ProblemHandler.class, new String[] { DefaultProblemHandler.ID, LongExecutionProblemHandler.ID }, "m_handlers"));
all.add(C(TransactionAnalyzer.class).is(PER_LOOKUP) //
all.add(C(MessageAnalyzer.class, TransactionAnalyzer.ID, TransactionAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, TaskDao.class));
all.add(C(EventAnalyzer.class).is(PER_LOOKUP) //
all.add(C(MessageAnalyzer.class, EventAnalyzer.ID, EventAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, TaskDao.class));
all.add(C(CrossAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(DatabaseAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, SqlParseManager.class));
all.add(C(SqlAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, SqlParseManager.class));
all.add(C(MatrixAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(StateAnalyzer.class).is(PER_LOOKUP)//
all.add(C(MessageAnalyzer.class, StateAnalyzer.ID, StateAnalyzer.class).is(PER_LOOKUP)//
.req(HostinfoDao.class, TaskDao.class, ReportDao.class, ProjectDao.class)//
.req(BucketManager.class, ServerStateManager.class));
all.add(C(TopIpAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(HeartbeatAnalyzer.class).is(PER_LOOKUP) //
all.add(C(MessageAnalyzer.class, HeartbeatAnalyzer.ID, HeartbeatAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class, TaskDao.class));
all.add(C(DumpAnalyzer.class).is(PER_LOOKUP) //
.req(ServerConfigManager.class, DumpUploader.class, ServerStateManager.class) //
all.add(C(MessageAnalyzer.class, DumpAnalyzer.ID, DumpAnalyzer.class).is(PER_LOOKUP) //
.req(ServerStateManager.class) //
.req(MessageBucketManager.class, LocalMessageBucketManager.ID));
all.add(C(TopAnalyzer.class).is(PER_LOOKUP) //
all.add(C(MessageAnalyzer.class, TopAnalyzer.ID, TopAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, ReportDao.class));
all.add(C(MetricAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, BusinessReportDao.class));
all.add(C(DumpUploader.class) //
.req(ServerConfigManager.class, FileSystemManager.class));
all.add(C(Module.class, CatConsumerModule.ID, CatConsumerModule.class));
// database
all.add(C(JdbcDataSourceConfigurationManager.class) //
.config(E("datasourceFile").value("/data/appdatas/cat/datasources.xml")));
all.addAll(new CatDatabaseConfigurator().defineComponents());
all.addAll(new CatCoreDatabaseConfigurator().defineComponents());
return all;
}
......
package com.dianping.cat.consumer.dump;
package com.dianping.cat.consumer.core;
import java.io.IOException;
import java.util.Collections;
......@@ -9,28 +9,21 @@ import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Threads;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.internal.MessageId;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.status.ServerStateManager;
import com.dianping.cat.storage.dump.LocalMessageBucketManager;
import com.dianping.cat.storage.dump.MessageBucketManager;
public class DumpAnalyzer extends AbstractMessageAnalyzer<Object> implements Initializable, LogEnabled {
@Inject
private ServerConfigManager m_configManager;
@Inject
private DumpUploader m_uploader;
public class DumpAnalyzer extends AbstractMessageAnalyzer<Object> implements LogEnabled {
public static final String ID = "dump";
@Inject(type = MessageBucketManager.class, value = LocalMessageBucketManager.ID)
private LocalMessageBucketManager m_bucketManager;
......@@ -42,8 +35,6 @@ public class DumpAnalyzer extends AbstractMessageAnalyzer<Object> implements Ini
private Map<String, Integer> m_errorTimestampDomains = new HashMap<String, Integer>();
private boolean m_localMode = true;
private static final long HOUR = 60 * 60 * 1000L;
private Logger m_logger;
......@@ -90,32 +81,11 @@ public class DumpAnalyzer extends AbstractMessageAnalyzer<Object> implements Ini
return Collections.emptySet();
}
public DumpUploader getDumpUploader() {
return m_uploader;
}
@Override
public Object getReport(String domain) {
throw new UnsupportedOperationException("This should not be called!");
}
@Override
public void initialize() throws InitializationException {
m_localMode = m_configManager.isLocalMode();
if (!m_localMode) {
m_uploader.start();
}
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
@Override
protected void process(MessageTree tree) {
if (tree.getMessage() == null) {
......@@ -160,11 +130,4 @@ public class DumpAnalyzer extends AbstractMessageAnalyzer<Object> implements Ini
m_oldVersionDomains.put(domain, size);
}
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
}
}
package com.dianping.cat.consumer.event;
package com.dianping.cat.consumer.core;
import java.util.Date;
import java.util.HashMap;
......@@ -10,12 +10,13 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.Task;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dainping.cat.consumer.core.dal.Task;
import com.dainping.cat.consumer.core.dal.TaskDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.event.model.entity.EventName;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.entity.EventType;
......@@ -25,12 +26,13 @@ import com.dianping.cat.consumer.event.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class EventAnalyzer extends AbstractMessageAnalyzer<EventReport> implements LogEnabled {
public static final String ID = "event";
@Inject
private BucketManager m_bucketManager;
......@@ -57,6 +59,7 @@ public class EventAnalyzer extends AbstractMessageAnalyzer<EventReport> implemen
return m_reports.keySet();
}
@Override
public EventReport getReport(String domain) {
EventReport report = m_reports.get(domain);
......@@ -72,14 +75,7 @@ public class EventAnalyzer extends AbstractMessageAnalyzer<EventReport> implemen
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -193,14 +189,6 @@ public class EventAnalyzer extends AbstractMessageAnalyzer<EventReport> implemen
return count;
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.event;
package com.dianping.cat.consumer.core;
import com.dianping.cat.consumer.event.model.entity.EventName;
import com.dianping.cat.consumer.event.model.entity.EventType;
import com.dianping.cat.consumer.event.model.transform.BaseVisitor;
public class StatisticsComputer extends BaseVisitor {
public class EventStatisticsComputer extends BaseVisitor {
@Override
public void visitName(EventName name) {
super.visitName(name);
......
package com.dianping.cat.consumer.heartbeat;
package com.dianping.cat.consumer.core;
import java.util.Calendar;
import java.util.Date;
......@@ -9,13 +9,15 @@ import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.Task;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dainping.cat.consumer.core.dal.Task;
import com.dainping.cat.consumer.core.dal.TaskDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.heartbeat.model.entity.Disk;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.entity.Period;
......@@ -24,7 +26,6 @@ import com.dianping.cat.consumer.heartbeat.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Heartbeat;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.status.model.entity.DiskInfo;
import com.dianping.cat.status.model.entity.DiskVolumeInfo;
......@@ -35,9 +36,10 @@ import com.dianping.cat.status.model.entity.StatusInfo;
import com.dianping.cat.status.model.entity.ThreadsInfo;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import org.unidal.lookup.annotation.Inject;
public class HeartbeatAnalyzer extends AbstractMessageAnalyzer<HeartbeatReport> implements LogEnabled {
public static final String ID = "heartbeat";
@Inject
private BucketManager m_bucketManager;
......@@ -88,7 +90,7 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer<HeartbeatReport>
StatusInfo info = null;
try {
info = new com.dianping.cat.status.model.transform.DefaultDomParser().parse(xml);
info = com.dianping.cat.status.model.transform.DefaultSaxParser.parse(xml);
} catch (Exception e) {
m_logger.error("Error when parse status info in heartbeat analyzer." + xml, e);
Cat.getProducer().logEvent("HearbeatAnalyzer", "ErrorXml", "Error", xml);
......@@ -111,17 +113,20 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer<HeartbeatReport>
period.setHttpThreadCount(thread.getHttpThreadCount());
MessageInfo catInfo = info.getMessage();
period.setCatMessageProduced(catInfo.getProduced());
period.setCatMessageOverflow(catInfo.getOverflowed());
period.setCatMessageSize(catInfo.getBytes());
MemoryInfo memeryInfo = info.getMemory();
List<GcInfo> gcs = info.getMemory().getGcs();
for (GcInfo gc : gcs) {
if ("ParNew".equals(gc.getName())) {
String name = gc.getName();
if ("ParNew".equals(name) || "PS Scavenge".equals(name)) {
period.setNewGcCount(gc.getCount());
} else if ("ConcurrentMarkSweep".equals(gc.getName())) {
} else if ("ConcurrentMarkSweep".equals(name) || "PS MarkSweep".equals(name)) {
period.setOldGcCount(gc.getCount());
}
}
......@@ -150,6 +155,7 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer<HeartbeatReport>
return period;
}
@Override
public HeartbeatReport getReport(String domain) {
HeartbeatReport report = m_reports.get(domain);
......@@ -165,14 +171,7 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer<HeartbeatReport>
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> reportBucket = null;
try {
......@@ -233,14 +232,6 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer<HeartbeatReport>
return count;
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.problem;
package com.dianping.cat.consumer.core;
import java.util.ArrayList;
import java.util.Date;
......@@ -13,13 +13,14 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.Task;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dainping.cat.consumer.core.dal.Task;
import com.dainping.cat.consumer.core.dal.TaskDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.problem.handler.Handler;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.core.problem.ProblemHandler;
import com.dianping.cat.consumer.problem.model.entity.Duration;
import com.dianping.cat.consumer.problem.model.entity.Entry;
import com.dianping.cat.consumer.problem.model.entity.Machine;
......@@ -29,12 +30,13 @@ import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser;
import com.dianping.cat.consumer.problem.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class ProblemAnalyzer extends AbstractMessageAnalyzer<ProblemReport> implements LogEnabled, Initializable {
public static final String ID = "problem";
@Inject
private BucketManager m_bucketManager;
......@@ -45,7 +47,7 @@ public class ProblemAnalyzer extends AbstractMessageAnalyzer<ProblemReport> impl
private TaskDao m_taskDao;
@Inject
private List<Handler> m_handlers;
private List<ProblemHandler> m_handlers;
private Map<String, ProblemReport> m_reports = new HashMap<String, ProblemReport>();
......@@ -80,6 +82,7 @@ public class ProblemAnalyzer extends AbstractMessageAnalyzer<ProblemReport> impl
return m_reports.keySet();
}
@Override
public ProblemReport getReport(String domain) {
ProblemReport report = m_reports.get(domain);
......@@ -97,18 +100,10 @@ public class ProblemAnalyzer extends AbstractMessageAnalyzer<ProblemReport> impl
@Override
public void initialize() throws InitializationException {
// to work around a performance issue within plexus
m_handlers = new ArrayList<Handler>(m_handlers);
m_handlers = new ArrayList<ProblemHandler>(m_handlers);
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> bucket = null;
try {
......@@ -145,19 +140,11 @@ public class ProblemAnalyzer extends AbstractMessageAnalyzer<ProblemReport> impl
report.addIp(tree.getIpAddress());
Machine machine = report.findOrCreateMachine(tree.getIpAddress());
for (Handler handler : m_handlers) {
for (ProblemHandler handler : m_handlers) {
handler.handle(machine, tree);
}
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......
package com.dianping.cat.consumer.state;
package com.dianping.cat.consumer.core;
import java.util.Date;
import java.util.HashMap;
......@@ -11,17 +11,18 @@ import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Hostinfo;
import com.dainping.cat.consumer.dal.report.HostinfoDao;
import com.dainping.cat.consumer.dal.report.Project;
import com.dainping.cat.consumer.dal.report.ProjectDao;
import com.dainping.cat.consumer.dal.report.ProjectEntity;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.Task;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dainping.cat.consumer.core.dal.Hostinfo;
import com.dainping.cat.consumer.core.dal.HostinfoDao;
import com.dainping.cat.consumer.core.dal.Project;
import com.dainping.cat.consumer.core.dal.ProjectDao;
import com.dainping.cat.consumer.core.dal.ProjectEntity;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dainping.cat.consumer.core.dal.Task;
import com.dainping.cat.consumer.core.dal.TaskDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.state.model.entity.Machine;
import com.dianping.cat.consumer.state.model.entity.ProcessDomain;
import com.dianping.cat.consumer.state.model.entity.StateReport;
......@@ -29,7 +30,6 @@ import com.dianping.cat.consumer.state.model.transform.BaseVisitor;
import com.dianping.cat.consumer.state.model.transform.DefaultXmlBuilder;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.status.ServerState.State;
import com.dianping.cat.status.ServerStateManager;
......@@ -37,8 +37,7 @@ import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implements LogEnabled {
private Map<String, StateReport> m_reports = new HashMap<String, StateReport>();
public static final String ID = "state";
@Inject
private ServerStateManager m_serverStateManager;
......@@ -58,6 +57,8 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
@Inject
private ProjectDao m_projectDao;
private Map<String, StateReport> m_reports = new HashMap<String, StateReport>();
private void buildStateInfo(Machine machine) {
long minute = 1000 * 60;
long start = m_startTime;
......@@ -222,14 +223,6 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
}
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
@Override
protected void process(MessageTree tree) {
StateReport report = m_reports.get("Cat");
......@@ -250,12 +243,6 @@ public class StateAnalyzer extends AbstractMessageAnalyzer<StateReport> implemen
processDomains.addIp(ip);
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
}
private void storeReport(boolean atEnd) {
if (atEnd) {
Transaction t = Cat.getProducer().newTransaction("Checkpoint", getClass().getSimpleName());
......
package com.dianping.cat.consumer.top;
package com.dianping.cat.consumer.core;
import java.util.Date;
import java.util.HashMap;
......@@ -10,28 +10,28 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.problem.ProblemAnalyzer;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.problem.model.entity.Entry;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.entity.Segment;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.consumer.top.model.transform.DefaultXmlBuilder;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.consumer.transaction.model.entity.Range2;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements LogEnabled {
public static final String ID = "top";
@Inject
private BucketManager m_bucketManager;
......@@ -57,10 +57,11 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
return new HashSet<String>();
}
@Override
public synchronized TopReport getReport(String domain) {
Set<String> domains = m_transactionAnalyzer.getDomains();
TopReport topReport = new TopReport("Cat");
topReport.setStartTime(new Date(m_startTime));
topReport.setEndTime(new Date(m_startTime + 60 * MINUTE - 1));
......@@ -69,7 +70,7 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
new TransactionReportVisitor(topReport).visitTransactionReport(report);
}
for (String temp : domains) {
ProblemReport report = m_problemAnalyzer.getReport(temp);
......@@ -78,30 +79,11 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
return topReport;
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
}
@Override
protected void process(MessageTree tree) {
// do nothing
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Bucket<String> reportBucket = null;
......@@ -183,8 +165,8 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
int minute = range2.getValue();
long count = range2.getCount();
double sum = range2.getSum();
com.dianping.cat.consumer.top.model.entity.Segment detail = m_report.findOrCreateDomain(m_domain)
.findOrCreateSegment(minute);
com.dianping.cat.consumer.top.model.entity.Segment detail = m_report.findOrCreateDomain(m_domain).findOrCreateSegment(
minute);
Range2Function function = Range2Function.getByName(m_type);
if (function != null) {
......@@ -199,6 +181,7 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
public static enum Range2Function {
URL {
@Override
public void apply(Range2 range2, com.dianping.cat.consumer.top.model.entity.Segment detail) {
long count = range2.getCount();
double sum = range2.getSum();
......@@ -310,12 +293,10 @@ public class TopAnalyzer extends AbstractMessageAnalyzer<TopReport> implements L
int count = segment.getCount();
if ("error".equals(m_type)) {
com.dianping.cat.consumer.top.model.entity.Segment temp = m_report.findOrCreateDomain(m_domain)
.findOrCreateSegment(id);
com.dianping.cat.consumer.top.model.entity.Segment temp = m_report.findOrCreateDomain(m_domain).findOrCreateSegment(id);
temp.setError(temp.getError() + count);
} else if ("call".equals(m_type)) {
com.dianping.cat.consumer.top.model.entity.Segment temp = m_report.findOrCreateDomain(m_domain)
.findOrCreateSegment(id);
com.dianping.cat.consumer.top.model.entity.Segment temp = m_report.findOrCreateDomain(m_domain).findOrCreateSegment(id);
temp.setCallError(temp.getCallError() + count);
}
}
......
package com.dianping.cat.consumer.transaction;
package com.dianping.cat.consumer.core;
import java.util.ArrayList;
import java.util.Collection;
......@@ -17,12 +17,13 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dainping.cat.consumer.dal.report.Report;
import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.Task;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dainping.cat.consumer.core.dal.Report;
import com.dainping.cat.consumer.core.dal.ReportDao;
import com.dainping.cat.consumer.core.dal.Task;
import com.dainping.cat.consumer.core.dal.TaskDao;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.transaction.model.entity.AllDuration;
import com.dianping.cat.consumer.transaction.model.entity.Duration;
import com.dianping.cat.consumer.transaction.model.entity.Machine;
......@@ -35,12 +36,13 @@ import com.dianping.cat.consumer.transaction.model.transform.BaseVisitor;
import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionReport> implements LogEnabled {
public static final String ID = "transaction";
@Inject
private BucketManager m_bucketManager;
......@@ -135,7 +137,7 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
report.setEndTime(new Date(m_startTime + MINUTE * 60 - 1));
}
report.getDomainNames().addAll(m_reports.keySet());
report.accept(new StatisticsComputer());
report.accept(new TransactionStatisticsComputer());
compute95Line(report);
return report;
}
......@@ -158,14 +160,7 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
}
@Override
protected boolean isTimeout() {
long currentTime = System.currentTimeMillis();
long endTime = m_startTime + m_duration + m_extraTime;
return currentTime > endTime;
}
private void loadReports() {
protected void loadReports() {
Bucket<String> bucket = null;
try {
......@@ -308,14 +303,6 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
range.setSum(range.getSum() + d);
}
public void setAnalyzerInfo(long startTime, long duration, long extraTime) {
m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
loadReports();
}
private void storeReports(boolean atEnd) {
Bucket<String> reportBucket = null;
Transaction t = Cat.getProducer().newTransaction("Checkpoint", getClass().getSimpleName());
......
package com.dianping.cat.consumer.transaction;
package com.dianping.cat.consumer.core;
import java.util.ArrayList;
import java.util.Collections;
......@@ -13,7 +13,6 @@ import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
public class TransactionReportUrlFilter extends com.dianping.cat.consumer.transaction.model.transform.DefaultXmlBuilder {
private int m_maxItems = 200;
private void mergeName(TransactionName old, TransactionName other) {
......
package com.dianping.cat.consumer.transaction;
package com.dianping.cat.consumer.core;
import com.dianping.cat.consumer.transaction.model.entity.Range;
import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
import com.dianping.cat.consumer.transaction.model.transform.BaseVisitor;
public class StatisticsComputer extends BaseVisitor {
public class TransactionStatisticsComputer extends BaseVisitor {
double std(long count, double avg, double sum2, double max) {
double value = sum2 / count - avg * avg;
......
package com.dianping.cat.consumer.problem.handler;
package com.dianping.cat.consumer.core.problem;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.dianping.cat.consumer.problem.ProblemType;
import org.unidal.helper.Splitters;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.consumer.problem.model.entity.Entry;
import com.dianping.cat.consumer.problem.model.entity.Machine;
import com.dianping.cat.message.Event;
......@@ -12,10 +14,10 @@ import com.dianping.cat.message.Heartbeat;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.MessageTree;
import org.unidal.helper.Splitters;
import org.unidal.lookup.annotation.Inject;
public class DefaultProblemHandler extends Handler {
public class DefaultProblemHandler extends ProblemHandler {
public static final String ID = "default-problem";
@Inject
private Set<String> m_errorTypes;
......
package com.dianping.cat.consumer.problem.handler;
package com.dianping.cat.consumer.core.problem;
import java.util.HashMap;
import java.util.List;
......@@ -6,18 +6,19 @@ import java.util.Map;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.configuration.server.entity.Domain;
import com.dianping.cat.consumer.problem.ProblemType;
import com.dianping.cat.consumer.problem.model.entity.Entry;
import com.dianping.cat.consumer.problem.model.entity.Machine;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.MessageTree;
import org.unidal.lookup.annotation.Inject;
public class LongExecutionHandler extends Handler implements Initializable {
public class LongExecutionProblemHandler extends ProblemHandler implements Initializable {
public static final String ID = "long-execution";
@Inject
private ServerConfigManager m_configManager;
......
package com.dianping.cat.consumer.problem.handler;
package com.dianping.cat.consumer.core.problem;
import java.util.List;
......@@ -10,7 +10,7 @@ import com.dianping.cat.consumer.problem.model.entity.Segment;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.spi.MessageTree;
public abstract class Handler {
public abstract class ProblemHandler {
public static final int MAX_LOG_SIZE = 60;
public abstract int handle(Machine machine, MessageTree tree);
......
package com.dianping.cat.consumer.problem;
package com.dianping.cat.consumer.core.problem;
public enum ProblemType {
ERROR("error"),
......
<?xml version="1.0" encoding="UTF-8"?>
<entities>
<entity name="business-report" table="businessReport" alias="b">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="type" field="type" value-type="int" length="3" nullable="false" />
<member name="name" field="name" value-type="String" length="20" nullable="false" />
<member name="ip" field="ip" value-type="String" length="20" nullable="false" />
<member name="product-line" field="productLine" value-type="String" length="50" nullable="false" />
<member name="period" field="period" value-type="Date" nullable="false" />
<member name="content" field="content" value-type="byte[]" length="2147483647" />
<member name="creation-date" field="creation_date" value-type="Date" nullable="false" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
<index name="IX_Group_Name_Period" members="productLine ASC, name ASC, period ASC" />
<index name="IX_Name_Period" members="name ASC, period ASC" />
<index name="IX_Period" members="period ASC" />
<readsets>
<readset name="FULL" all="true" />
</readsets>
<updatesets>
<updateset name="FULL" all="true" />
</updatesets>
<query-defs>
<query name="find-by-PK" type="SELECT">
<param name="key-id" />
<statement><![CDATA[SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[INSERT INTO <TABLE/>(<FIELDS/>)
VALUES(<VALUES/>)]]></statement>
</query>
<query name="update-by-PK" type="UPDATE">
<param name="key-id" />
<statement><![CDATA[UPDATE <TABLE/>
SET <FIELDS/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="delete-by-PK" type="DELETE">
<param name="key-id" />
<statement><![CDATA[DELETE FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
</query-defs>
</entity>
<entity name="hostinfo" table="hostinfo" alias="h">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="ip" field="ip" value-type="String" length="50" nullable="false" />
......@@ -168,46 +124,6 @@
</query>
</query-defs>
</entity>
<entity name="sqltable" table="sqltable" alias="s">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="domain" field="domain" value-type="String" length="50" />
<member name="sql-name" field="sql_name" value-type="String" length="100" />
<member name="table-name" field="table_name" value-type="String" length="100" />
<member name="sql-statement" field="sql_statement" value-type="String" length="1000" />
<member name="creation-date" field="creation_date" value-type="Date" />
<member name="modify-date" field="modify_date" value-type="Date" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
<readsets>
<readset name="FULL" all="true" />
</readsets>
<updatesets>
<updateset name="FULL" all="true" />
</updatesets>
<query-defs>
<query name="find-by-PK" type="SELECT">
<param name="key-id" />
<statement><![CDATA[SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[INSERT INTO <TABLE/>(<FIELDS/>)
VALUES(<VALUES/>)]]></statement>
</query>
<query name="update-by-PK" type="UPDATE">
<param name="key-id" />
<statement><![CDATA[UPDATE <TABLE/>
SET <FIELDS/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="delete-by-PK" type="DELETE">
<param name="key-id" />
<statement><![CDATA[DELETE FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
</query-defs>
</entity>
<entity name="task" table="task" alias="t">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="producer" field="producer" value-type="String" length="20" nullable="false" />
......
<?xml version="1.0" encoding="UTF-8"?>
<entities do-package="com.dainping.cat.consumer.dal.report" gen="true">
<entities do-package="com.dainping.cat.consumer.core.dal" gen="true">
<entity name="report" table="report" alias="r">
<member name="creation-date" insert-expr="NOW()" />
<var name="start-date" value-type="Date" />
......@@ -299,16 +299,6 @@
</query>
</query-defs>
</entity>
<entity name="sqltable">
<member name="creation-date" insert-expr="NOW()" />
<member name="modify-date" insert-expr="NOW()" update-expr="NOW()" />
<query-defs>
<query name="find-all-by-domain" type="SELECT" multiple="true">
<param name="domain" />
<statement><![CDATA[SELECT <FIELDS/> FROM <TABLE/> WHERE <FIELD name='domain'/> = ${domain}]]></statement>
</query>
</query-defs>
</entity>
<entity name="project" table="project" alias="p">
<member name="creation-date" insert-expr="NOW()" />
<member name="modify-date" insert-expr="NOW()" update-expr="NOW()" />
......@@ -328,44 +318,4 @@
</query>
</query-defs>
</entity>
<entity name="business-report" table="businessReport" alias="b">
<member name="creation-date" insert-expr="NOW()" />
<var name="start-date" value-type="Date" />
<var name="end-date" value-type="Date" />
<query-defs>
<query name="find-all-by-productLine-name-duration" type="SELECT" multiple="true">
<param name="start-date" />
<param name="end-date" />
<param name="product-line" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> >= ${start-date}
AND <FIELD name='period'/> < ${end-date}
AND <FIELD name='product-line'/> = ${product-line}
AND <FIELD name='name'/> = ${name}
]]></statement>
</query>
<query name="find-all-by-period-productLine-name" type="SELECT" multiple="true">
<param name="period" />
<param name="product-line" />
<param name="name" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='period'/> = ${period}
AND <FIELD name='product-line'/> = ${product-line}
AND <FIELD name='name'/> = ${name}
]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[
INSERT
INTO <TABLE/>(<FIELDS/>)
VALUES(<VALUES/>)
]]></statement>
</query>
</query-defs>
</entity>
</entities>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.cross.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="cross-report" root="true">
<attribute name="domain" key="true" />
<element name="domain" value-type="String" type="set" names="domain-names" />
<element name="ip" value-type="String" type="set" names="ips" />
<entity-ref name="local" type="map" names="locals" method-find-or-create="true"/>
</entity>
<entity name="local">
<attribute name="id" value-type="String" key="true"/>
<entity-ref name="remote" type="map" names="remotes" method-find-or-create="true"/>
</entity>
<entity name="remote">
<attribute name="id" value-type="String" key="true"/>
<entity-ref name="type" />
</entity>
<entity name="type">
<attribute name="id" value-type="String"/>
<attribute name="totalCount" value-type="long" primitive="true" method-inc="true"/>
<attribute name="failCount" value-type="int" primitive="true" method-inc="true"/>
<attribute name="failPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="sum" value-type="double" primitive="true" format="0.00"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
<entity-ref name="name" type="map" names="names" method-find-or-create="true"/>
</entity>
<entity name="name">
<attribute name="id" value-type="String" key="true"/>
<attribute name="totalCount" value-type="long" primitive="true" method-inc="true"/>
<attribute name="failCount" value-type="int" primitive="true" method-inc="true"/>
<attribute name="failPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="sum" value-type="double" primitive="true" format="0.00"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.database.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="database-report" root="true">
<attribute name="database" value-type="String" key="true"/>
<attribute name="connect-url" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="databaseName" value-type="String" type="set" names="databaseNames" />
<element name="domainName" value-type="String" type="set" names="domainNames" />
<entity-ref name="domain" type="map" names="domains" method-find-or-create="true" />
</entity>
<entity name="domain">
<attribute name="id" value-type="String" key="true"/>
<entity-ref name="table" type="map" names="tables" method-find-or-create="true" />
</entity>
<entity name="table">
<attribute name="id" value-type="String" key="true"/>
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true"/>
<attribute name="failCount" value-type="int" method-inc="true" primitive="true"/>
<attribute name="failPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="sum" value-type="double" primitive="true" format="0.00"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
<entity-ref name="method" type="map" names="methods" method-find-or-create="true"/>
</entity>
<entity name="method">
<attribute name="id" value-type="String" key="true"/>
<element name="sql" value-type="String" type="set" names="sqlNames"/>
<attribute name="totalCount" value-type="int" method-inc="true" primitive="true"/>
<attribute name="failCount" value-type="int" method-inc="true" primitive="true" />
<attribute name="failPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="totalPercent" value-type="double" primitive="true" format="0.00"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="sum" value-type="double" primitive="true" format="0.00"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.event.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="event-report" root="true">
<attribute name="domain" key="true" />
......
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.health.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="health-report" root="true">
<attribute name="domain" value-type="String" key="true"/>
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<element name="domain" value-type="String" type="set" names="domainNames" />
<entity-ref name="problem-info" />
<entity-ref name="url" />
<entity-ref name="service" />
<entity-ref name="clientService" />
<entity-ref name="call" />
<entity-ref name="sql" />
<entity-ref name="web-cache" />
<entity-ref name="kvdb-cache" />
<entity-ref name="mem-cache" />
<entity-ref name="machine-info" />
</entity>
<entity name="machine-info">
<attribute name="numbers" value-type="int" primitive="true" />
<attribute name="avg-load" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-load" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-load-count" value-type="int" primitive="true"/>
<attribute name="avg-load-sum" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-load-machine" value-type="String"/>
<attribute name="avg-oldgc" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-oldgc" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-oldgc-count" value-type="int" primitive="true"/>
<attribute name="avg-oldgc-sum" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-oldgc-machine" value-type="String"/>
<attribute name="avg-http" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-http" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-http-count" value-type="int" primitive="true" />
<attribute name="avg-http-sum" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-http-machine" value-type="String"/>
<attribute name="avg-pigeon" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-pigeon" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-pigeon-count" value-type="int" primitive="true"/>
<attribute name="avg-pigeon-sum" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-pigeon-machine" value-type="String"/>
<attribute name="avg-memory-used" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-memory-used" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-memory-used-count" value-type="int" primitive="true"/>
<attribute name="avg-memory-used-sum" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-memory-used-machine" value-type="String"/>
</entity>
<entity name="problem-info">
<attribute name="exceptions" value-type="long" primitive="true"/>
<attribute name="longSqls" value-type="long" primitive="true"/>
<attribute name="long-sqlPercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="longUrls" value-type="long" primitive="true"/>
<attribute name="long-urlPercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="longServices" value-type="long" primitive="true"/>
<attribute name="long-servicePercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="longCaches" value-type="long" primitive="true" />
<attribute name="long-cachePercent" value-type="double" primitive="true" format="0.000000"/>
</entity>
<entity name="url">
<entity-ref name="base-info" />
</entity>
<entity name="base-info">
<attribute name="total" value-type="long" primitive="true"/>
<attribute name="response-time" value-type="double" primitive="true" format="0.00"/>
<attribute name="error-total" value-type="long" primitive="true"/>
<attribute name="error-percent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="success-percent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
</entity>
<entity name="service">
<entity-ref name="base-info" />
</entity>
<entity name="clientService">
<entity-ref name="base-info" />
</entity>
<entity name="call">
<entity-ref name="base-info" />
</entity>
<entity name="sql">
<entity-ref name="base-info" />
</entity>
<entity name="web-cache">
<entity-ref name="base-cache-info" />
</entity>
<entity name="base-cache-info">
<attribute name="total" value-type="long" primitive="true"/>
<attribute name="response-time" value-type="double" primitive="true" format="0.00"/>
<attribute name="hit-percent" value-type="double" primitive="true" format="0.000000"/>
</entity>
<entity name="kvdb-cache">
<entity-ref name="base-cache-info" />
</entity>
<entity name="mem-cache">
<entity-ref name="base-cache-info" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.heartbeat.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="heartbeat-report" root="true">
<attribute name="domain" value-type="String" key="true"/>
......
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="month-report" root="true">
<attribute name="domain" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="day" value-type="int" />
<element name="domain" value-type="String" type="list" names="domains" />
<entity-ref name="problem-info" />
<entity-ref name="url" />
<entity-ref name="service" />
<entity-ref name="call" />
<entity-ref name="sql" />
<entity-ref name="web-cache" />
<entity-ref name="kvdb-cache" />
<entity-ref name="mem-cache" />
</entity>
<entity name="problem-info">
<attribute name="exceptions" value-type="long" />
<attribute name="avg-exceptions" value-type="double" />
<attribute name="longSqls" value-type="long" />
<attribute name="avg-longSqls" value-type="double" />
<attribute name="long-sqlPercent" value-type="double" />
<attribute name="longUrls" value-type="long" />
<attribute name="avg-longUrls" value-type="double" />
<attribute name="long-urlPercent" value-type="double" />
<attribute name="longServices" value-type="long" />
<attribute name="avg-longServices" value-type="double" />
<attribute name="long-servicePercent" value-type="double" />
<attribute name="longCaches" value-type="long" />
<attribute name="avg-longCaches" value-type="double" />
<attribute name="long-cachePercent" value-type="double" />
</entity>
<entity name="url">
<entity-ref name="base-info" />
</entity>
<entity name="base-info">
<attribute name="total" value-type="int" />
<attribute name="avg" value-type="double" />
<attribute name="response-time" value-type="double" />
<attribute name="error-total" value-type="int" />
<attribute name="error-avg" value-type="double" />
<attribute name="error-percent" value-type="double" />
</entity>
<entity name="service">
<entity-ref name="base-info" />
</entity>
<entity name="call">
<entity-ref name="base-info" />
</entity>
<entity name="sql">
<entity-ref name="base-info" />
</entity>
<entity name="web-cache">
<entity-ref name="base-cache-info" />
</entity>
<entity name="base-cache-info">
<attribute name="total" value-type="int" />
<attribute name="avg" value-type="double" />
<attribute name="response-time" value-type="double" />
<attribute name="hit-percent" value-type="double" />
</entity>
<entity name="kvdb-cache">
<entity-ref name="base-cache-info" />
</entity>
<entity name="mem-cache">
<entity-ref name="base-cache-info" />
</entity>
</model>
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册