Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
梦中观雨
cat
提交
8cd3a4cc
C
cat
项目概览
梦中观雨
/
cat
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
cat
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8cd3a4cc
编写于
9月 06, 2012
作者:
Y
youyong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modify the database report
上级
04e18247
变更
44
隐藏空白更改
内联
并排
Showing
44 changed file
with
1891 addition
and
95 deletion
+1891
-95
cat-consumer/pom.xml
cat-consumer/pom.xml
+10
-0
cat-consumer/src/main/java/com/dianping/cat/consumer/DefaultAnalyzerFactory.java
...ava/com/dianping/cat/consumer/DefaultAnalyzerFactory.java
+6
-0
cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java
...m/dianping/cat/consumer/build/ComponentsConfigurator.java
+5
-1
cat-consumer/src/main/java/com/dianping/cat/consumer/database/DatabaseAnalyzer.java
.../com/dianping/cat/consumer/database/DatabaseAnalyzer.java
+345
-0
cat-consumer/src/main/resources/META-INF/dal/model/database-report-codegen.xml
.../resources/META-INF/dal/model/database-report-codegen.xml
+35
-0
cat-consumer/src/main/resources/META-INF/dal/model/database-report-manifest.xml
...resources/META-INF/dal/model/database-report-manifest.xml
+6
-0
cat-consumer/src/main/resources/META-INF/dal/model/database-report-model.xml
...in/resources/META-INF/dal/model/database-report-model.xml
+40
-0
cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-model.xml
...n/resources/META-INF/dal/model/heartbeat-report-model.xml
+1
-1
cat-consumer/src/main/resources/META-INF/plexus/components.xml
...onsumer/src/main/resources/META-INF/plexus/components.xml
+14
-1
cat-consumer/src/test/resources/com/dianping/cat/cat/consumer/model/database-report.xml
...s/com/dianping/cat/cat/consumer/model/database-report.xml
+19
-0
cat-consumer/src/test/resources/com/dianping/cat/consumer/database/database-report.xml
...es/com/dianping/cat/consumer/database/database-report.xml
+19
-0
cat-consumer/src/test/resources/com/dianping/cat/consumer/sql/sql-report.xml
...st/resources/com/dianping/cat/consumer/sql/sql-report.xml
+15
-35
cat-consumer/src/test/resources/com/dianping/cat/consumer/sql/sql.xml
.../src/test/resources/com/dianping/cat/consumer/sql/sql.xml
+0
-37
cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
...n/java/com/dianping/cat/build/ComponentsConfigurator.java
+6
-0
cat-home/src/main/java/com/dianping/cat/build/ServiceComponentConfigurator.java
.../com/dianping/cat/build/ServiceComponentConfigurator.java
+12
-0
cat-home/src/main/java/com/dianping/cat/helper/CatString.java
...home/src/main/java/com/dianping/cat/helper/CatString.java
+2
-0
cat-home/src/main/java/com/dianping/cat/report/ReportModule.java
...e/src/main/java/com/dianping/cat/report/ReportModule.java
+3
-1
cat-home/src/main/java/com/dianping/cat/report/ReportPage.java
...ome/src/main/java/com/dianping/cat/report/ReportPage.java
+3
-1
cat-home/src/main/java/com/dianping/cat/report/page/database/Action.java
...in/java/com/dianping/cat/report/page/database/Action.java
+28
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/Context.java
...n/java/com/dianping/cat/report/page/database/Context.java
+7
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/DisplayDatabase.java
...om/dianping/cat/report/page/database/DisplayDatabase.java
+71
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/Handler.java
...n/java/com/dianping/cat/report/page/database/Handler.java
+193
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/JspFile.java
...n/java/com/dianping/cat/report/page/database/JspFile.java
+18
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/JspViewer.java
...java/com/dianping/cat/report/page/database/JspViewer.java
+20
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/Model.java
...ain/java/com/dianping/cat/report/page/database/Model.java
+115
-0
cat-home/src/main/java/com/dianping/cat/report/page/database/Payload.java
...n/java/com/dianping/cat/report/page/database/Payload.java
+65
-0
cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/DisplayHeartbeat.java
.../dianping/cat/report/page/heartbeat/DisplayHeartbeat.java
+2
-2
cat-home/src/main/java/com/dianping/cat/report/page/matrix/Handler.java
...ain/java/com/dianping/cat/report/page/matrix/Handler.java
+0
-2
cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java
...main/java/com/dianping/cat/report/page/model/Handler.java
+33
-1
cat-home/src/main/java/com/dianping/cat/report/page/model/Payload.java
...main/java/com/dianping/cat/report/page/model/Payload.java
+11
-0
cat-home/src/main/java/com/dianping/cat/report/page/model/database/CompositeDatabaseService.java
.../report/page/model/database/CompositeDatabaseService.java
+43
-0
cat-home/src/main/java/com/dianping/cat/report/page/model/database/DatabaseReportMerger.java
.../cat/report/page/model/database/DatabaseReportMerger.java
+92
-0
cat-home/src/main/java/com/dianping/cat/report/page/model/database/HistoricalDatabaseService.java
...report/page/model/database/HistoricalDatabaseService.java
+75
-0
cat-home/src/main/java/com/dianping/cat/report/page/model/database/LocalDatabaseService.java
.../cat/report/page/model/database/LocalDatabaseService.java
+61
-0
cat-home/src/main/java/com/dianping/cat/report/page/model/database/RemoteDatabaseService.java
...cat/report/page/model/database/RemoteDatabaseService.java
+20
-0
cat-home/src/main/java/com/dianping/cat/report/task/database/DatabaseMerger.java
...com/dianping/cat/report/task/database/DatabaseMerger.java
+45
-0
cat-home/src/main/java/com/dianping/cat/report/task/database/DatabaseReportBuilder.java
...nping/cat/report/task/database/DatabaseReportBuilder.java
+78
-0
cat-home/src/main/java/com/dianping/cat/report/view/NavigationBar.java
...main/java/com/dianping/cat/report/view/NavigationBar.java
+3
-1
cat-home/src/main/resources/META-INF/plexus/components.xml
cat-home/src/main/resources/META-INF/plexus/components.xml
+125
-0
cat-home/src/main/resources/META-INF/wizard/webapp/wizard.xml
...home/src/main/resources/META-INF/wizard/webapp/wizard.xml
+3
-0
cat-home/src/main/webapp/css/database.css
cat-home/src/main/webapp/css/database.css
+29
-0
cat-home/src/main/webapp/jsp/report/database.jsp
cat-home/src/main/webapp/jsp/report/database.jsp
+139
-0
cat-home/src/main/webapp/jsp/report/event.jsp
cat-home/src/main/webapp/jsp/report/event.jsp
+3
-6
cat-home/src/test/java/com/dianping/cat/demo/TestSendMessage.java
.../src/test/java/com/dianping/cat/demo/TestSendMessage.java
+71
-6
未找到文件。
cat-consumer/pom.xml
浏览文件 @
8cd3a4cc
...
...
@@ -32,6 +32,16 @@
<artifactId>
codegen-maven-plugin
</artifactId>
<version>
1.1.5
</version>
<executions>
<execution>
<id>
generate database report model
</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
</manifest>
</configuration>
</execution>
<execution>
<id>
generate sql report model
</id>
<phase>
generate-sources
</phase>
...
...
cat-consumer/src/main/java/com/dianping/cat/consumer/DefaultAnalyzerFactory.java
浏览文件 @
8cd3a4cc
...
...
@@ -2,6 +2,7 @@ package com.dianping.cat.consumer;
import
com.dianping.cat.consumer.common.CommonAnalyzer
;
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
;
...
...
@@ -53,6 +54,11 @@ public class DefaultAnalyzerFactory extends ContainerHolder implements AnalyzerF
}
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
(
"common"
))
{
...
...
cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java
浏览文件 @
8cd3a4cc
...
...
@@ -10,6 +10,7 @@ import com.dianping.cat.consumer.DefaultAnalyzerFactory;
import
com.dianping.cat.consumer.RealtimeConsumer
;
import
com.dianping.cat.consumer.common.CommonAnalyzer
;
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.DumpChannelManager
;
import
com.dianping.cat.consumer.dump.DumpUploader
;
...
...
@@ -48,7 +49,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all
.
add
(
C
(
MessageConsumer
.
class
,
"realtime"
,
RealtimeConsumer
.
class
)
//
.
req
(
AnalyzerFactory
.
class
,
LogviewUploader
.
class
)
//
.
config
(
E
(
"extraTime"
).
value
(
property
(
"extraTime"
,
"180000"
))
//
,
E
(
"analyzers"
).
value
(
"problem,transaction,event,heartbeat,matrix,cross,common,dump"
)));
,
E
(
"analyzers"
).
value
(
"problem,transaction,event,heartbeat,matrix,cross,common,d
atabase,d
ump"
)));
String
errorTypes
=
"Error,RuntimeException,Exception"
;
String
failureTypes
=
"URL,SQL,Call,Cache"
;
...
...
@@ -72,6 +73,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
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
));
all
.
add
(
C
(
MatrixAnalyzer
.
class
).
is
(
PER_LOOKUP
)
//
.
req
(
BucketManager
.
class
,
ReportDao
.
class
));
...
...
cat-consumer/src/main/java/com/dianping/cat/consumer/database/DatabaseAnalyzer.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.consumer.database
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
org.codehaus.plexus.logging.LogEnabled
;
import
org.codehaus.plexus.logging.Logger
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.configuration.NetworkInterfaceManager
;
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
;
import
com.dianping.cat.consumer.database.model.entity.Table
;
import
com.dianping.cat.consumer.database.model.transform.DefaultSaxParser
;
import
com.dianping.cat.consumer.database.model.transform.DefaultXmlBuilder
;
import
com.dianping.cat.hadoop.dal.Report
;
import
com.dianping.cat.hadoop.dal.ReportDao
;
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
com.site.lookup.annotation.Inject
;
public
class
DatabaseAnalyzer
extends
AbstractMessageAnalyzer
<
DatabaseReport
>
implements
LogEnabled
{
@Inject
private
BucketManager
m_bucketManager
;
@Inject
private
ReportDao
m_reportDao
;
private
Map
<
String
,
DatabaseReport
>
m_reports
=
new
HashMap
<
String
,
DatabaseReport
>();
@Override
public
void
doCheckpoint
(
boolean
atEnd
)
{
storeReports
(
atEnd
);
}
@Override
public
void
enableLogging
(
Logger
logger
)
{
m_logger
=
logger
;
}
@Override
public
Set
<
String
>
getDomains
()
{
return
m_reports
.
keySet
();
}
public
DatabaseReport
getReport
(
String
domain
)
{
DatabaseReport
report
=
m_reports
.
get
(
domain
);
if
(
report
==
null
)
{
report
=
new
DatabaseReport
(
domain
);
}
report
.
getDatabaseNames
().
addAll
(
m_reports
.
keySet
());
return
report
;
}
@Override
protected
boolean
isTimeout
()
{
long
currentTime
=
System
.
currentTimeMillis
();
long
endTime
=
m_startTime
+
m_duration
+
m_extraTime
;
return
currentTime
>
endTime
;
}
private
void
loadReports
()
{
Bucket
<
String
>
reportBucket
=
null
;
try
{
reportBucket
=
m_bucketManager
.
getReportBucket
(
m_startTime
,
"database"
);
for
(
String
id
:
reportBucket
.
getIds
())
{
String
xml
=
reportBucket
.
findById
(
id
);
DatabaseReport
report
=
DefaultSaxParser
.
parse
(
xml
);
m_reports
.
put
(
report
.
getDatabase
(),
report
);
}
}
catch
(
Exception
e
)
{
m_logger
.
error
(
String
.
format
(
"Error when loading database reports of %s!"
,
new
Date
(
m_startTime
)),
e
);
}
finally
{
if
(
reportBucket
!=
null
)
{
m_bucketManager
.
closeBucket
(
reportBucket
);
}
}
}
@Override
protected
void
process
(
MessageTree
tree
)
{
Message
message
=
tree
.
getMessage
();
if
(
message
instanceof
Transaction
)
{
processTransaction
(
tree
,
(
Transaction
)
message
);
}
}
private
void
processTransaction
(
MessageTree
tree
,
Transaction
t
)
{
String
type
=
t
.
getType
();
if
(
"SQL"
.
equals
(
type
))
{
DatabaseItem
item
=
buildDataBaseItem
(
t
);
if
(
item
!=
null
)
{
String
sqlName
=
t
.
getName
();
String
domainName
=
tree
.
getDomain
();
String
database
=
item
.
getDatabase
();
String
tables
=
item
.
getTables
();
String
method
=
item
.
getMethod
();
DatabaseReport
report
=
m_reports
.
get
(
database
);
if
(
report
==
null
)
{
report
=
new
DatabaseReport
(
database
);
report
.
setStartTime
(
new
Date
(
m_startTime
));
report
.
setEndTime
(
new
Date
(
m_startTime
+
MINUTE
*
60
-
1
));
m_reports
.
put
(
database
,
report
);
}
report
.
addDomainName
(
tree
.
getDomain
());
report
.
setConnectUrl
(
item
.
getConnectionUrl
());
Domain
domain
=
report
.
findOrCreateDomain
(
domainName
);
Table
allTable
=
domain
.
findOrCreateTable
(
"All"
);
Table
table
=
domain
.
findOrCreateTable
(
tables
);
updateTableInfo
(
allTable
,
method
,
sqlName
,
t
);
updateTableInfo
(
table
,
method
,
sqlName
,
t
);
allTable
.
setTotalPercent
(
1
);
table
.
setTotalPercent
(
table
.
getTotalCount
()
/
(
double
)
allTable
.
getTotalCount
());
}
}
else
{
List
<
Message
>
messages
=
t
.
getChildren
();
for
(
Message
message
:
messages
)
{
if
(
message
instanceof
Transaction
)
{
processTransaction
(
tree
,
(
Transaction
)
message
);
}
}
}
}
private
void
updateTableInfo
(
Table
table
,
String
method
,
String
sqlName
,
Transaction
t
)
{
String
status
=
t
.
getStatus
();
double
duration
=
t
.
getDurationInMicros
()
/
1000
d
;
Method
m
=
table
.
findOrCreateMethod
(
method
);
if
(!
status
.
equals
(
Message
.
SUCCESS
))
{
m
.
incFailCount
();
table
.
incFailCount
();
}
m
.
addSql
(
sqlName
);
m
.
incTotalCount
();
m
.
setSum
(
m
.
getSum
()
+
duration
);
m
.
setAvg
(
m
.
getSum
()
/
(
double
)
m
.
getTotalCount
());
m
.
setFailPercent
(
m
.
getFailCount
()
/
(
double
)
m
.
getTotalCount
());
table
.
incTotalCount
();
table
.
setSum
(
table
.
getSum
()
+
duration
);
table
.
setAvg
(
table
.
getSum
()
/
(
double
)
table
.
getTotalCount
());
table
.
setFailPercent
(
table
.
getFailCount
()
/
(
double
)
table
.
getTotalCount
());
m
.
setTotalPercent
(
m
.
getTotalCount
()
/
(
double
)
table
.
getTotalCount
());
}
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
;
Transaction
t
=
Cat
.
getProducer
().
newTransaction
(
"Checkpoint"
,
getClass
().
getSimpleName
());
try
{
reportBucket
=
m_bucketManager
.
getReportBucket
(
m_startTime
,
"database"
);
for
(
DatabaseReport
report
:
m_reports
.
values
())
{
Set
<
String
>
domainNames
=
report
.
getDatabaseNames
();
domainNames
.
clear
();
domainNames
.
addAll
(
getDomains
());
String
xml
=
builder
.
buildXml
(
report
);
String
domain
=
report
.
getDatabase
();
reportBucket
.
storeById
(
domain
,
xml
);
}
if
(
atEnd
&&
!
isLocalMode
())
{
Date
period
=
new
Date
(
m_startTime
);
String
ip
=
NetworkInterfaceManager
.
INSTANCE
.
getLocalHostAddress
();
for
(
DatabaseReport
report
:
m_reports
.
values
())
{
try
{
Report
r
=
m_reportDao
.
createLocal
();
String
xml
=
builder
.
buildXml
(
report
);
String
domain
=
report
.
getDatabase
();
r
.
setName
(
"database"
);
r
.
setDomain
(
domain
);
r
.
setPeriod
(
period
);
r
.
setIp
(
ip
);
r
.
setType
(
1
);
r
.
setContent
(
xml
);
m_reportDao
.
insert
(
r
);
// Task task = m_taskDao.createLocal();
// task.setCreationDate(new Date());
// task.setProducer(ip);
// task.setReportDomain(domain);
// task.setReportName("database");
// task.setReportPeriod(period);
// task.setStatus(1); // status todo
// m_taskDao.insert(task);
// m_logger.info("insert database task:" + task.toString());
}
catch
(
Throwable
e
)
{
Cat
.
getProducer
().
logError
(
e
);
}
}
}
t
.
setStatus
(
Message
.
SUCCESS
);
}
catch
(
Exception
e
)
{
Cat
.
getProducer
().
logError
(
e
);
t
.
setStatus
(
e
);
m_logger
.
error
(
String
.
format
(
"Error when storing database reports of %s!"
,
new
Date
(
m_startTime
)),
e
);
}
finally
{
t
.
complete
();
if
(
reportBucket
!=
null
)
{
m_bucketManager
.
closeBucket
(
reportBucket
);
}
}
}
private
DatabaseItem
buildDataBaseItem
(
Transaction
t
)
{
List
<
Message
>
messages
=
t
.
getChildren
();
String
connection
=
null
;
String
method
=
null
;
String
sql
=
(
String
)
t
.
getData
();
for
(
Message
message
:
messages
)
{
if
(
message
instanceof
Event
)
{
String
type
=
message
.
getType
();
if
(
type
.
equals
(
"SQL"
))
{
method
=
message
.
getName
();
}
else
if
(
type
.
equals
(
"SQL.database"
))
{
connection
=
message
.
getName
();
}
}
}
if
(
connection
!=
null
&&
method
!=
null
)
{
DatabaseItem
item
=
new
DatabaseItem
();
String
tables
=
getTableNamesBySql
(
sql
);
String
database
=
getDataBaseName
(
connection
);
item
.
setDatabase
(
database
).
setTables
(
tables
).
setMethod
(
method
).
setConnectionUrl
(
connection
);
return
item
;
}
return
null
;
}
private
String
getTableNamesBySql
(
String
sql
)
{
try
{
if
(
sql
==
null
||
sql
.
length
()
==
0
)
sql
=
"TTT"
;
return
"Table"
+
sql
.
substring
(
0
,
6
);
}
catch
(
Exception
e
)
{
}
return
"Test"
;
}
private
String
getDataBaseName
(
String
url
)
{
try
{
int
index
=
url
.
indexOf
(
"://"
);
String
temp
=
url
.
substring
(
index
+
3
);
index
=
temp
.
indexOf
(
"/"
);
int
index2
=
temp
.
indexOf
(
"?"
);
String
schema
=
temp
.
substring
(
index
+
1
,
index2
!=
-
1
?
index2
:
temp
.
length
());
return
schema
;
}
catch
(
Exception
e
)
{
}
return
"Unknown"
;
}
public
static
class
DatabaseItem
{
private
String
m_connectionUrl
;
private
String
m_database
;
private
String
m_tables
;
private
String
m_method
;
public
String
getDatabase
()
{
return
m_database
;
}
public
String
getConnectionUrl
()
{
return
m_connectionUrl
;
}
public
DatabaseItem
setConnectionUrl
(
String
connectionUrl
)
{
m_connectionUrl
=
connectionUrl
;
return
this
;
}
public
DatabaseItem
setDatabase
(
String
database
)
{
m_database
=
database
;
return
this
;
}
public
String
getTables
()
{
return
m_tables
;
}
public
DatabaseItem
setTables
(
String
tables
)
{
m_tables
=
tables
;
return
this
;
}
public
String
getMethod
()
{
return
m_method
;
}
public
DatabaseItem
setMethod
(
String
method
)
{
m_method
=
method
;
return
this
;
}
}
}
cat-consumer/src/main/resources/META-INF/dal/model/database-report-codegen.xml
0 → 100644
浏览文件 @
8cd3a4cc
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity
name=
"database-report"
root=
"true"
>
<attribute
name=
"database"
value-type=
"String"
/>
<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=
"list"
names=
"databaseNames"
/>
<entity-ref
name=
"domain"
type=
"list"
names=
"domains"
/>
</entity>
<entity
name=
"domain"
>
<attribute
name=
"id"
value-type=
"String"
/>
<entity-ref
name=
"table"
type=
"list"
names=
"tables"
/>
</entity>
<entity
name=
"table"
>
<attribute
name=
"id"
value-type=
"String"
/>
<attribute
name=
"totalCount"
value-type=
"int"
/>
<attribute
name=
"failCount"
value-type=
"int"
/>
<attribute
name=
"failPercent"
value-type=
"double"
/>
<attribute
name=
"avg"
value-type=
"double"
/>
<attribute
name=
"sum"
value-type=
"double"
/>
<attribute
name=
"tps"
value-type=
"double"
/>
<entity-ref
name=
"method"
type=
"list"
names=
"methods"
/>
</entity>
<entity
name=
"method"
>
<attribute
name=
"id"
value-type=
"String"
/>
<attribute
name=
"totalCount"
value-type=
"int"
/>
<attribute
name=
"failCount"
value-type=
"int"
/>
<attribute
name=
"failPercent"
value-type=
"double"
/>
<attribute
name=
"avg"
value-type=
"double"
/>
<attribute
name=
"sum"
value-type=
"double"
/>
<attribute
name=
"tps"
value-type=
"double"
/>
</entity>
</model>
cat-consumer/src/main/resources/META-INF/dal/model/database-report-manifest.xml
0 → 100644
浏览文件 @
8cd3a4cc
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file
path=
"database-report-codegen.xml"
/>
<file
path=
"database-report-model.xml"
/>
</manifest>
cat-consumer/src/main/resources/META-INF/dal/model/database-report-model.xml
0 → 100644
浏览文件 @
8cd3a4cc
<?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>
cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-model.xml
浏览文件 @
8cd3a4cc
...
...
@@ -30,7 +30,7 @@
<attribute
name=
"system-load-average"
value-type=
"double"
primitive=
"true"
/>
<attribute
name=
"cat-message-produced"
value-type=
"long"
primitive=
"true"
/>
<attribute
name=
"cat-message-overflow"
value-type=
"long"
primitive=
"true"
/>
<attribute
name=
"cat-message-size"
value-type=
"
long"
primitive=
"true"
/>
<attribute
name=
"cat-message-size"
value-type=
"
double"
primitive=
"true"
format=
"0.00"
/>
<entity-ref
name=
"disk"
type=
"list"
names=
"disks"
/>
</entity>
<entity
name=
"disk"
>
...
...
cat-consumer/src/main/resources/META-INF/plexus/components.xml
浏览文件 @
8cd3a4cc
...
...
@@ -10,7 +10,7 @@
<implementation>
com.dianping.cat.consumer.RealtimeConsumer
</implementation>
<configuration>
<extraTime>
180000
</extraTime>
<analyzers>
problem,transaction,event,heartbeat,matrix,cross,common,dump
</analyzers>
<analyzers>
problem,transaction,event,heartbeat,matrix,cross,common,d
atabase,d
ump
</analyzers>
</configuration>
<requirements>
<requirement>
...
...
@@ -109,6 +109,19 @@
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.consumer.database.DatabaseAnalyzer
</role>
<implementation>
com.dianping.cat.consumer.database.DatabaseAnalyzer
</implementation>
<instantiation-strategy>
per-lookup
</instantiation-strategy>
<requirements>
<requirement>
<role>
com.dianping.cat.storage.BucketManager
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.ReportDao
</role>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.consumer.matrix.MatrixAnalyzer
</role>
<implementation>
com.dianping.cat.consumer.matrix.MatrixAnalyzer
</implementation>
...
...
cat-consumer/src/test/resources/com/dianping/cat/cat/consumer/model/database-report.xml
0 → 100644
浏览文件 @
8cd3a4cc
<database-report
database=
"CAT"
connect-url=
"jdbc://10.1.1.220:3306/cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<databaseName>
CAT1
</databaseName>
<databaseName>
CAT2
</databaseName>
<domain
id=
"Cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</domain>
<domain></domain>
</database-report>
cat-consumer/src/test/resources/com/dianping/cat/consumer/database/database-report.xml
0 → 100644
浏览文件 @
8cd3a4cc
<database-report
database=
"CAT"
connect-url=
"jdbc://10.1.1.220:3306/cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<databaseName>
CAT1
</databaseName>
<databaseName>
CAT2
</databaseName>
<domain
id=
"Cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</domain>
<domain></domain>
</database-report>
cat-consumer/src/test/resources/com/dianping/cat/consumer/sql/sql-report.xml
浏览文件 @
8cd3a4cc
<sql-report>
<sql-domain-report
domain=
"Cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<domain>
Cat
</domain>
<domain>
MobileApi
</domain>
<ip>
10.1.77.193
</ip>
<ip>
10.1.77.194
</ip>
<database
id=
"CatDabase"
connect-url=
"jdbc://10.1.1.220:3306/cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</database>
</sql-domain-report>
<sql-database-report
database=
"CAT"
connect-url=
"jdbc://10.1.1.220:3306/cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<database>
CAT1
</database>
<database>
CAT2
</database>
<domain
id=
"Cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</domain>
<domain></domain>
</sql-database-report>
<sql-report
domain=
"Cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<domain>
Cat
</domain>
<domain>
MobileApi
</domain>
<database
id=
"CatDabase"
connect-url=
"jdbc://10.1.1.220:3306/cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</database>
</sql-report>
...
...
cat-consumer/src/test/resources/com/dianping/cat/consumer/sql/sql.xml
已删除
100644 → 0
浏览文件 @
04e18247
<sql-report>
<sql-domain-report
domain=
"Cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<domainName>
Cat
</domainName>
<domainName>
MobileApi
</domainName>
<database
id=
"CatDabase"
connect-url=
"jdbc://10.1.1.220:3306/cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</database>
</sql-domain-report>
<sql-database-report
database=
"CAT"
connect-url=
"jdbc://10.1.1.220:3306/cat"
startTime=
"2012-06-18 14:00:00"
endTime=
"2012-06-18 14:59:59"
>
<databaseName>
CAT1
</databaseName>
<databaseName>
CAT2
</databaseName>
<domain
id=
"Cat"
>
<table
id=
"HostInfo"
totalCount=
"111507"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"1937.0"
tps=
"0.00"
>
<method
id=
"select"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
<method
id=
"insert"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
avg=
"0.0"
sum=
"0.9"
tps=
"0.00"
></method>
</table>
<table></table>
</domain>
<domain></domain>
</sql-database-report>
</sql-report>
cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
浏览文件 @
8cd3a4cc
...
...
@@ -22,6 +22,8 @@ import com.dianping.cat.report.task.ReportFacade;
import
com.dianping.cat.report.task.TaskConsumer
;
import
com.dianping.cat.report.task.cross.CrossMerger
;
import
com.dianping.cat.report.task.cross.CrossReportBuilder
;
import
com.dianping.cat.report.task.database.DatabaseMerger
;
import
com.dianping.cat.report.task.database.DatabaseReportBuilder
;
import
com.dianping.cat.report.task.event.EventGraphCreator
;
import
com.dianping.cat.report.task.event.EventMerger
;
import
com.dianping.cat.report.task.event.EventReportBuilder
;
...
...
@@ -75,6 +77,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all
.
add
(
C
(
ProblemMerger
.
class
));
all
.
add
(
C
(
HeartbeatMerger
.
class
));
all
.
add
(
C
(
CrossMerger
.
class
));
all
.
add
(
C
(
DatabaseMerger
.
class
));
all
.
add
(
C
(
TransactionReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
TransactionGraphCreator
.
class
,
...
...
@@ -93,6 +96,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all
.
add
(
C
(
MatrixReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
MatrixMerger
.
class
));
all
.
add
(
C
(
DatabaseReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
DatabaseMerger
.
class
));
all
.
add
(
C
(
CrossReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
CrossMerger
.
class
));
...
...
cat-home/src/main/java/com/dianping/cat/build/ServiceComponentConfigurator.java
浏览文件 @
8cd3a4cc
...
...
@@ -13,6 +13,9 @@ import com.dianping.cat.message.spi.MessageConsumer;
import
com.dianping.cat.report.page.model.cross.CompositeCrossService
;
import
com.dianping.cat.report.page.model.cross.HistoricalCrossService
;
import
com.dianping.cat.report.page.model.cross.LocalCrossService
;
import
com.dianping.cat.report.page.model.database.CompositeDatabaseService
;
import
com.dianping.cat.report.page.model.database.HistoricalDatabaseService
;
import
com.dianping.cat.report.page.model.database.LocalDatabaseService
;
import
com.dianping.cat.report.page.model.event.CompositeEventService
;
import
com.dianping.cat.report.page.model.event.HistoricalEventService
;
import
com.dianping.cat.report.page.model.event.LocalEventService
;
...
...
@@ -102,6 +105,15 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
.
req
(
ServerConfigManager
.
class
)
//
.
req
(
ModelService
.
class
,
new
String
[]
{
"cross-historical"
},
"m_services"
));
all
.
add
(
C
(
ModelService
.
class
,
"database-local"
,
LocalDatabaseService
.
class
)
//
.
req
(
BucketManager
.
class
,
ReportDao
.
class
)
//
.
req
(
MessageConsumer
.
class
,
"realtime"
));
all
.
add
(
C
(
ModelService
.
class
,
"database-historical"
,
HistoricalDatabaseService
.
class
)
//
.
req
(
BucketManager
.
class
,
ReportDao
.
class
));
all
.
add
(
C
(
ModelService
.
class
,
"database"
,
CompositeDatabaseService
.
class
)
//
.
req
(
ServerConfigManager
.
class
)
//
.
req
(
ModelService
.
class
,
new
String
[]
{
"database-historical"
},
"m_services"
));
all
.
add
(
C
(
ModelService
.
class
,
"ip-local"
,
LocalIpService
.
class
)
//
.
req
(
BucketManager
.
class
)
//
.
req
(
MessageConsumer
.
class
,
"realtime"
));
...
...
cat-home/src/main/java/com/dianping/cat/helper/CatString.java
浏览文件 @
8cd3a4cc
...
...
@@ -2,4 +2,6 @@ package com.dianping.cat.helper;
public
class
CatString
{
public
static
final
String
ALL_IP
=
"All"
;
public
static
final
String
ALL_Domain
=
"All"
;
}
cat-home/src/main/java/com/dianping/cat/report/ReportModule.java
浏览文件 @
8cd3a4cc
...
...
@@ -37,7 +37,9 @@ com.dianping.cat.report.page.monthreport.Handler.class,
com
.
dianping
.
cat
.
report
.
page
.
cross
.
Handler
.
class
,
com
.
dianping
.
cat
.
report
.
page
.
cache
.
Handler
.
class
com
.
dianping
.
cat
.
report
.
page
.
cache
.
Handler
.
class
,
com
.
dianping
.
cat
.
report
.
page
.
database
.
Handler
.
class
})
public
class
ReportModule
extends
AbstractModule
{
...
...
cat-home/src/main/java/com/dianping/cat/report/ReportPage.java
浏览文件 @
8cd3a4cc
...
...
@@ -35,7 +35,9 @@ public enum ReportPage implements Page {
CROSS
(
"cross"
,
"cross"
,
"Cross"
,
"Cross"
,
true
),
CACHE
(
"cache"
,
"cache"
,
"Cache"
,
"Cache"
,
true
);
CACHE
(
"cache"
,
"cache"
,
"Cache"
,
"Cache"
,
true
),
DATABASE
(
"database"
,
"database"
,
"Database"
,
"Database"
,
true
);
private
String
m_name
;
...
...
cat-home/src/main/java/com/dianping/cat/report/page/database/Action.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
public
enum
Action
implements
com
.
site
.
web
.
mvc
.
Action
{
HOURLY_REPORT
(
"hourly"
),
HISTORY_REPORT
(
"history"
);
public
static
Action
getByName
(
String
name
,
Action
defaultAction
)
{
for
(
Action
action
:
Action
.
values
())
{
if
(
action
.
getName
().
equals
(
name
))
{
return
action
;
}
}
return
defaultAction
;
}
private
String
m_name
;
private
Action
(
String
name
)
{
m_name
=
name
;
}
@Override
public
String
getName
()
{
return
m_name
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/database/Context.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
import
com.dianping.cat.report.ReportContext
;
public
class
Context
extends
ReportContext
<
Payload
>
{
}
cat-home/src/main/java/com/dianping/cat/report/page/database/DisplayDatabase.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.List
;
import
org.apache.commons.lang.StringUtils
;
import
com.dianping.cat.consumer.database.model.entity.Table
;
import
com.dianping.cat.consumer.database.model.transform.BaseVisitor
;
public
class
DisplayDatabase
extends
BaseVisitor
{
private
String
m_sortBy
=
"name"
;
private
List
<
Table
>
m_results
=
new
ArrayList
<
Table
>();
public
List
<
Table
>
getResults
()
{
Collections
.
sort
(
m_results
,
new
TableCompartor
(
m_sortBy
));
return
m_results
;
}
public
DisplayDatabase
setSortBy
(
String
sortBy
)
{
if
(!
StringUtils
.
isEmpty
(
sortBy
))
{
m_sortBy
=
sortBy
;
}
return
this
;
}
@Override
public
void
visitTable
(
Table
table
)
{
m_results
.
add
(
table
);
}
public
static
class
TableCompartor
implements
Comparator
<
Table
>
{
private
String
m_sorted
;
public
TableCompartor
(
String
sort
)
{
m_sorted
=
sort
;
}
@Override
public
int
compare
(
Table
m1
,
Table
m2
)
{
if
(
m1
.
getId
()
!=
null
&&
m1
.
getId
().
startsWith
(
"All"
))
{
return
-
1
;
}
if
(
m2
.
getId
()
!=
null
&&
m2
.
getId
().
startsWith
(
"All"
))
{
return
1
;
}
if
(
m_sorted
.
equals
(
"name"
))
{
return
m1
.
getId
().
compareTo
(
m2
.
getId
());
}
if
(
m_sorted
.
equals
(
"total"
))
{
return
(
int
)
(
m2
.
getTotalCount
()
-
m1
.
getTotalCount
());
}
if
(
m_sorted
.
equals
(
"failure"
))
{
return
(
int
)
(
m2
.
getFailCount
()
-
m1
.
getFailCount
());
}
if
(
m_sorted
.
equals
(
"failurePercent"
))
{
return
(
int
)
(
m2
.
getFailPercent
()
*
1000
-
m1
.
getFailPercent
()
*
1000
);
}
if
(
m_sorted
.
equals
(
"avg"
))
{
return
(
int
)
(
m2
.
getAvg
()
*
1000
-
m1
.
getAvg
()
*
1000
);
}
return
0
;
}
}
}
cat-home/src/main/java/com/dianping/cat/report/page/database/Handler.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Set
;
import
javax.servlet.ServletException
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.configuration.ServerConfigManager
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.consumer.database.model.transform.DefaultSaxParser
;
import
com.dianping.cat.hadoop.dal.Dailyreport
;
import
com.dianping.cat.hadoop.dal.DailyreportDao
;
import
com.dianping.cat.hadoop.dal.DailyreportEntity
;
import
com.dianping.cat.hadoop.dal.Report
;
import
com.dianping.cat.hadoop.dal.ReportDao
;
import
com.dianping.cat.hadoop.dal.ReportEntity
;
import
com.dianping.cat.report.ReportPage
;
import
com.dianping.cat.report.page.model.database.DatabaseReportMerger
;
import
com.dianping.cat.report.page.model.spi.ModelRequest
;
import
com.dianping.cat.report.page.model.spi.ModelResponse
;
import
com.dianping.cat.report.page.model.spi.ModelService
;
import
com.dianping.cat.report.task.TaskHelper
;
import
com.dianping.cat.report.task.database.DatabaseMerger
;
import
com.site.dal.jdbc.DalException
;
import
com.site.lookup.annotation.Inject
;
import
com.site.lookup.util.StringUtils
;
import
com.site.web.mvc.PageHandler
;
import
com.site.web.mvc.annotation.InboundActionMeta
;
import
com.site.web.mvc.annotation.OutboundActionMeta
;
import
com.site.web.mvc.annotation.PayloadMeta
;
/**
* @author youyong
*/
public
class
Handler
implements
PageHandler
<
Context
>
{
public
static
final
long
ONE_HOUR
=
3600
*
1000L
;
@Inject
protected
ReportDao
m_reportDao
;
@Inject
private
DatabaseMerger
m_databaseMerger
;
@Inject
private
DailyreportDao
m_dailyreportDao
;
@Inject
private
JspViewer
m_jspViewer
;
@Inject
private
ServerConfigManager
m_manager
;
@Inject
(
type
=
ModelService
.
class
,
value
=
"database"
)
private
ModelService
<
DatabaseReport
>
m_service
;
private
DatabaseReport
getHourlyReport
(
Payload
payload
)
{
String
domain
=
payload
.
getDomain
();
String
date
=
String
.
valueOf
(
payload
.
getDate
());
String
ipAddress
=
payload
.
getIpAddress
();
ModelRequest
request
=
new
ModelRequest
(
domain
,
payload
.
getPeriod
())
//
.
setProperty
(
"date"
,
date
)
//
.
setProperty
(
"ip"
,
ipAddress
)
//
.
setProperty
(
"database"
,
payload
.
getDatabase
());
if
(
m_service
.
isEligable
(
request
))
{
ModelResponse
<
DatabaseReport
>
response
=
m_service
.
invoke
(
request
);
DatabaseReport
report
=
response
.
getModel
();
return
report
;
}
else
{
throw
new
RuntimeException
(
"Internal error: no eligable database service registered for "
+
request
+
"!"
);
}
}
@Override
@PayloadMeta
(
Payload
.
class
)
@InboundActionMeta
(
name
=
"database"
)
public
void
handleInbound
(
Context
ctx
)
throws
ServletException
,
IOException
{
// display only, no action here
}
@Override
@OutboundActionMeta
(
name
=
"database"
)
public
void
handleOutbound
(
Context
ctx
)
throws
ServletException
,
IOException
{
Model
model
=
new
Model
(
ctx
);
Payload
payload
=
ctx
.
getPayload
();
normalize
(
model
,
payload
);
switch
(
payload
.
getAction
())
{
case
HISTORY_REPORT:
DatabaseReport
historyReport
=
showSummarizeReport
(
model
,
payload
);
DisplayDatabase
displayHistoryDatabase
=
new
DisplayDatabase
();
displayHistoryDatabase
.
setSortBy
(
payload
.
getSortBy
()).
visitDatabaseReport
(
historyReport
);
model
.
setReport
(
historyReport
);
model
.
setDisplayDatabase
(
displayHistoryDatabase
);
break
;
case
HOURLY_REPORT:
DatabaseReport
hourlyReport
=
getHourlyReport
(
payload
);
DisplayDatabase
displayDatabase
=
new
DisplayDatabase
();
displayDatabase
.
setSortBy
(
payload
.
getSortBy
()).
visitDatabaseReport
(
hourlyReport
);
model
.
setReport
(
hourlyReport
);
model
.
setDisplayDatabase
(
displayDatabase
);
break
;
}
m_jspViewer
.
view
(
ctx
,
model
);
}
public
void
normalize
(
Model
model
,
Payload
payload
)
{
Action
action
=
payload
.
getAction
();
model
.
setAction
(
action
);
model
.
setPage
(
ReportPage
.
DATABASE
);
if
(
StringUtils
.
isEmpty
(
payload
.
getDomain
()))
{
payload
.
setDomain
(
"All"
);
}
if
(
StringUtils
.
isEmpty
(
payload
.
getDatabase
()))
{
payload
.
setDatabase
(
"cat"
);
}
model
.
setDatabase
(
payload
.
getDatabase
());
model
.
setDisplayDomain
(
payload
.
getDomain
());
model
.
setDomain
(
payload
.
getDomain
());
if
(
payload
.
getPeriod
().
isFuture
())
{
model
.
setLongDate
(
payload
.
getCurrentDate
());
}
else
{
model
.
setLongDate
(
payload
.
getDate
());
}
if
(
action
==
Action
.
HISTORY_REPORT
)
{
String
type
=
payload
.
getReportType
();
if
(
type
==
null
||
type
.
length
()
==
0
)
{
payload
.
setReportType
(
"day"
);
}
model
.
setReportType
(
payload
.
getReportType
());
payload
.
computeStartDate
();
if
(!
payload
.
isToday
())
{
payload
.
setYesterdayDefault
();
}
model
.
setLongDate
(
payload
.
getDate
());
model
.
setCustomDate
(
payload
.
getHistoryStartDate
(),
payload
.
getHistoryEndDate
());
}
}
private
DatabaseReport
showSummarizeReport
(
Model
model
,
Payload
payload
)
{
String
domain
=
payload
.
getDomain
();
DatabaseReport
databaseReport
=
null
;
Date
start
=
payload
.
getHistoryStartDate
();
Date
end
=
payload
.
getHistoryEndDate
();
Date
currentDayStart
=
TaskHelper
.
todayZero
(
new
Date
());
if
(
currentDayStart
.
getTime
()
==
start
.
getTime
())
{
try
{
List
<
Report
>
reports
=
m_reportDao
.
findAllByDomainNameDuration
(
start
,
end
,
domain
,
"database"
,
ReportEntity
.
READSET_FULL
);
List
<
Report
>
allReports
=
m_reportDao
.
findAllByDomainNameDuration
(
start
,
end
,
null
,
null
,
ReportEntity
.
READSET_DOMAIN_NAME
);
Set
<
String
>
domains
=
new
HashSet
<
String
>();
for
(
Report
report
:
allReports
)
{
domains
.
add
(
report
.
getDomain
());
}
databaseReport
=
m_databaseMerger
.
mergeForDaily
(
domain
,
reports
,
domains
);
}
catch
(
DalException
e
)
{
Cat
.
logError
(
e
);
}
}
else
{
try
{
List
<
Dailyreport
>
reports
=
m_dailyreportDao
.
findAllByDomainNameDuration
(
start
,
end
,
domain
,
"database"
,
DailyreportEntity
.
READSET_FULL
);
DatabaseReportMerger
merger
=
new
DatabaseReportMerger
(
new
DatabaseReport
(
domain
));
for
(
Dailyreport
report
:
reports
)
{
String
xml
=
report
.
getContent
();
DatabaseReport
reportModel
=
DefaultSaxParser
.
parse
(
xml
);
reportModel
.
accept
(
merger
);
}
databaseReport
=
merger
.
getDatabaseReport
();
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
}
}
databaseReport
.
setStartTime
(
start
);
databaseReport
.
setEndTime
(
end
);
return
databaseReport
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/database/JspFile.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
public
enum
JspFile
{
HOURLY
(
"/jsp/report/database.jsp"
),
HISTORY
(
"/jsp/report/databaseHistory.jsp"
)
;
private
String
m_path
;
private
JspFile
(
String
path
)
{
m_path
=
path
;
}
public
String
getPath
()
{
return
m_path
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/database/JspViewer.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
import
com.dianping.cat.report.ReportPage
;
import
com.site.web.mvc.view.BaseJspViewer
;
public
class
JspViewer
extends
BaseJspViewer
<
ReportPage
,
Action
,
Context
,
Model
>
{
@Override
protected
String
getJspFilePath
(
Context
ctx
,
Model
model
)
{
Action
action
=
model
.
getAction
();
switch
(
action
)
{
case
HOURLY_REPORT:
return
JspFile
.
HOURLY
.
getPath
();
case
HISTORY_REPORT:
return
JspFile
.
HISTORY
.
getPath
();
}
throw
new
RuntimeException
(
"Unknown action: "
+
action
);
}
}
cat-home/src/main/java/com/dianping/cat/report/page/database/Model.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Set
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.report.page.AbstractReportModel
;
import
com.dianping.cat.report.view.StringSortHelper
;
public
class
Model
extends
AbstractReportModel
<
Action
,
Context
>
{
private
DatabaseReport
m_report
;
private
DisplayDatabase
m_displayDatabase
;
private
String
m_ipAddress
;
private
String
m_domain
;
private
String
m_database
;
public
Model
(
Context
ctx
)
{
super
(
ctx
);
}
public
String
getDatabase
()
{
return
m_database
;
}
public
Collection
<
String
>
getDatabases
()
{
if
(
m_report
==
null
)
{
ArrayList
<
String
>
arrayList
=
new
ArrayList
<
String
>();
arrayList
.
add
(
getDatabase
());
return
arrayList
;
}
else
{
Set
<
String
>
domainNames
=
m_report
.
getDatabaseNames
();
domainNames
.
add
(
getDatabase
());
return
StringSortHelper
.
sortDomain
(
domainNames
);
}
}
@Override
public
Action
getDefaultAction
()
{
return
Action
.
HOURLY_REPORT
;
}
public
DisplayDatabase
getDisplayDatabase
()
{
return
m_displayDatabase
;
}
@Override
public
String
getDomain
()
{
return
m_domain
;
}
public
List
<
String
>
getDomains
()
{
if
(
m_report
==
null
)
{
ArrayList
<
String
>
arrayList
=
new
ArrayList
<
String
>();
arrayList
.
add
(
getDomain
());
return
arrayList
;
}
else
{
Set
<
String
>
domainNames
=
m_report
.
getDomainNames
();
return
StringSortHelper
.
sortDomain
(
domainNames
);
}
}
public
String
getIpAddress
()
{
return
m_ipAddress
;
}
public
List
<
String
>
getIps
()
{
if
(
m_report
==
null
)
{
ArrayList
<
String
>
arrayList
=
new
ArrayList
<
String
>();
arrayList
.
add
(
getDomain
());
return
arrayList
;
}
else
{
Set
<
String
>
domainNames
=
m_report
.
getDomainNames
();
domainNames
.
add
(
getDomain
());
return
StringSortHelper
.
sortDomain
(
domainNames
);
}
}
public
DatabaseReport
getReport
()
{
return
m_report
;
}
public
void
setDatabase
(
String
database
)
{
m_database
=
database
;
}
public
void
setDisplayDatabase
(
DisplayDatabase
displayDatabase
)
{
m_displayDatabase
=
displayDatabase
;
}
public
void
setDomain
(
String
domain
)
{
m_domain
=
domain
;
}
public
void
setIpAddress
(
String
ipAddress
)
{
m_ipAddress
=
ipAddress
;
}
public
void
setReport
(
DatabaseReport
report
)
{
m_report
=
report
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/database/Payload.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.database
;
import
com.dianping.cat.report.ReportPage
;
import
com.dianping.cat.report.page.AbstractReportPayload
;
import
com.site.web.mvc.ActionContext
;
import
com.site.web.mvc.payload.annotation.FieldMeta
;
public
class
Payload
extends
AbstractReportPayload
<
Action
>
{
private
ReportPage
m_page
;
@FieldMeta
(
"sort"
)
private
String
sortBy
;
@FieldMeta
(
"op"
)
private
Action
m_action
;
@FieldMeta
(
"database"
)
private
String
m_database
;
public
Payload
()
{
super
(
ReportPage
.
DATABASE
);
}
@Override
public
Action
getAction
()
{
return
m_action
;
}
public
String
getDatabase
()
{
return
m_database
;
}
@Override
public
ReportPage
getPage
()
{
return
m_page
;
}
public
String
getSortBy
()
{
return
sortBy
;
}
public
void
setAction
(
String
action
)
{
m_action
=
Action
.
getByName
(
action
,
Action
.
HOURLY_REPORT
);
}
public
void
setDatabase
(
String
database
)
{
m_database
=
database
;
}
@Override
public
void
setPage
(
String
page
)
{
m_page
=
ReportPage
.
getByName
(
page
,
ReportPage
.
DATABASE
);
}
public
void
setSortBy
(
String
sortBy
)
{
this
.
sortBy
=
sortBy
;
}
@Override
public
void
validate
(
ActionContext
<?>
ctx
)
{
if
(
m_action
==
null
)
{
m_action
=
Action
.
getByName
(
"hourly"
,
Action
.
HOURLY_REPORT
);
}
}
}
cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/DisplayHeartbeat.java
浏览文件 @
8cd3a4cc
...
...
@@ -92,8 +92,8 @@ public class DisplayHeartbeat {
m_httpThreads
[
minute
]
=
period
.
getHttpThreadCount
();
m_catMessageProduced
[
minute
]
=
period
.
getCatMessageProduced
();
m_catMessageOverflow
[
minute
]
=
period
.
getCatMessageOverflow
();
period
.
setCatMessageSize
(
period
.
getCatMessageSize
()
/
K
/
K
);
m_catMessageSize
[
minute
]
=
(
double
)
period
.
getCatMessageSize
()
/
K
/
K
;
period
.
setCatMessageSize
(
(
double
)(
period
.
getCatMessageSize
()
/
K
/
K
)
);
m_catMessageSize
[
minute
]
=
period
.
getCatMessageSize
()
;
m_newGcCount
[
minute
]
=
period
.
getNewGcCount
();
m_oldGcCount
[
minute
]
=
period
.
getOldGcCount
();
...
...
cat-home/src/main/java/com/dianping/cat/report/page/matrix/Handler.java
浏览文件 @
8cd3a4cc
...
...
@@ -35,8 +35,6 @@ import com.site.web.mvc.annotation.PayloadMeta;
public
class
Handler
implements
PageHandler
<
Context
>
{
public
static
final
double
NOTEXIST
=
-
1
;
public
static
final
long
ONE_HOUR
=
3600
*
1000L
;
@Inject
...
...
cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java
浏览文件 @
8cd3a4cc
...
...
@@ -8,6 +8,7 @@ import javax.servlet.ServletException;
import
org.apache.commons.lang.StringUtils
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.consumer.database.model.entity.Domain
;
import
com.dianping.cat.consumer.event.model.entity.EventName
;
import
com.dianping.cat.consumer.event.model.entity.EventType
;
import
com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport
;
...
...
@@ -24,6 +25,7 @@ import com.dianping.cat.helper.CatString;
import
com.dianping.cat.message.internal.MessageId
;
import
com.dianping.cat.report.ReportPage
;
import
com.dianping.cat.report.page.model.cross.LocalCrossService
;
import
com.dianping.cat.report.page.model.database.LocalDatabaseService
;
import
com.dianping.cat.report.page.model.event.LocalEventService
;
import
com.dianping.cat.report.page.model.heartbeat.LocalHeartbeatService
;
import
com.dianping.cat.report.page.model.ip.LocalIpService
;
...
...
@@ -74,6 +76,9 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
@Inject
(
type
=
ModelService
.
class
,
value
=
"cross-local"
)
private
LocalCrossService
m_crossService
;
@Inject
(
type
=
ModelService
.
class
,
value
=
"database-local"
)
private
LocalDatabaseService
m_databaseService
;
private
String
doFilter
(
Payload
payload
,
Object
dataModel
)
{
String
report
=
payload
.
getReport
();
String
ipAddress
=
payload
.
getIpAddress
();
...
...
@@ -100,7 +105,13 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
HeartBeatReportFilter
filter
=
new
HeartBeatReportFilter
(
ipAddress
);
return
filter
.
buildXml
((
com
.
dianping
.
cat
.
consumer
.
heartbeat
.
model
.
IEntity
<?>)
dataModel
);
}
else
{
}
else
if
(
"database"
.
equals
(
report
)){
String
domain
=
payload
.
getDomain
();
DatabaseReportFilter
filter
=
new
DatabaseReportFilter
(
domain
);
return
filter
.
buildXml
((
com
.
dianping
.
cat
.
consumer
.
database
.
model
.
IEntity
<?>)
dataModel
);
}
else
{
return
String
.
valueOf
(
dataModel
);
}
}
...
...
@@ -159,6 +170,10 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
response
=
m_matrixService
.
invoke
(
request
);
}
else
if
(
"cross"
.
equals
(
report
))
{
response
=
m_crossService
.
invoke
(
request
);
}
else
if
(
"database"
.
equals
(
report
))
{
String
databaseName
=
payload
.
getDatabase
();
ModelRequest
database
=
new
ModelRequest
(
databaseName
,
payload
.
getPeriod
());
response
=
m_databaseService
.
invoke
(
database
);
}
else
{
throw
new
RuntimeException
(
"Unsupported report: "
+
report
+
"!"
);
}
...
...
@@ -371,4 +386,21 @@ public class Handler extends ContainerHolder implements PageHandler<Context> {
}
}
}
static
class
DatabaseReportFilter
extends
com
.
dianping
.
cat
.
consumer
.
database
.
model
.
transform
.
DefaultXmlBuilder
{
private
String
m_domain
;
public
DatabaseReportFilter
(
String
domain
)
{
m_domain
=
domain
;
}
@Override
public
void
visitDomain
(
Domain
domain
)
{
String
id
=
domain
.
getId
();
if
(
m_domain
.
equals
(
"All"
)
||
m_domain
.
equals
(
id
))
{
super
.
visitDomain
(
domain
);
}
}
}
}
cat-home/src/main/java/com/dianping/cat/report/page/model/Payload.java
浏览文件 @
8cd3a4cc
...
...
@@ -40,6 +40,9 @@ public class Payload implements ActionPayload<ReportPage, Action> {
@FieldMeta
(
"type"
)
private
String
m_type
;
@FieldMeta
(
"database"
)
private
String
m_database
;
@Override
public
Action
getAction
()
{
return
m_action
;
...
...
@@ -147,6 +150,14 @@ public class Payload implements ActionPayload<ReportPage, Action> {
m_type
=
type
;
}
public
String
getDatabase
()
{
return
m_database
;
}
public
void
setDatabase
(
String
database
)
{
m_database
=
database
;
}
@Override
public
void
validate
(
ActionContext
<?>
ctx
)
{
if
(
m_action
==
null
)
{
...
...
cat-home/src/main/java/com/dianping/cat/report/page/model/database/CompositeDatabaseService.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.model.database
;
import
java.util.List
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.helper.CatString
;
import
com.dianping.cat.report.page.model.spi.ModelRequest
;
import
com.dianping.cat.report.page.model.spi.ModelResponse
;
import
com.dianping.cat.report.page.model.spi.internal.BaseCompositeModelService
;
import
com.dianping.cat.report.page.model.spi.internal.BaseRemoteModelService
;
public
class
CompositeDatabaseService
extends
BaseCompositeModelService
<
DatabaseReport
>
{
public
CompositeDatabaseService
()
{
super
(
"database"
);
}
@Override
protected
BaseRemoteModelService
<
DatabaseReport
>
createRemoteService
()
{
return
new
RemoteDatabaseService
();
}
@Override
protected
DatabaseReport
merge
(
ModelRequest
request
,
List
<
ModelResponse
<
DatabaseReport
>>
responses
)
{
if
(
responses
.
size
()
==
0
)
{
return
null
;
}
DatabaseReportMerger
merger
=
new
DatabaseReportMerger
(
new
DatabaseReport
(
request
.
getProperty
(
"database"
)));
String
domain
=
request
.
getDomain
();
if
(
domain
.
equals
(
CatString
.
ALL_Domain
)){
merger
.
setAllDomain
(
true
);
}
for
(
ModelResponse
<
DatabaseReport
>
response
:
responses
)
{
DatabaseReport
model
=
response
.
getModel
();
if
(
model
!=
null
)
{
model
.
accept
(
merger
);
}
}
return
merger
.
getDatabaseReport
();
}
}
cat-home/src/main/java/com/dianping/cat/report/page/model/database/DatabaseReportMerger.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.model.database
;
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
;
import
com.dianping.cat.consumer.database.model.entity.Table
;
import
com.dianping.cat.consumer.database.model.transform.DefaultMerger
;
import
com.dianping.cat.helper.CatString
;
public
class
DatabaseReportMerger
extends
DefaultMerger
{
private
boolean
m_allDomain
=
false
;
private
Domain
m_all
;
public
DatabaseReportMerger
(
DatabaseReport
databaseReport
)
{
super
(
databaseReport
);
}
@Override
public
void
visitDomain
(
Domain
domain
)
{
if
(
m_allDomain
)
{
visitDomainChildren
(
m_all
,
domain
);
}
else
{
super
.
visitDomain
(
domain
);
}
}
@Override
protected
void
mergeTable
(
Table
old
,
Table
table
)
{
double
sum
=
0
;
if
(
old
.
getTotalPercent
()
>
0
)
{
sum
+=
old
.
getTotalCount
()
/
old
.
getTotalPercent
();
}
if
(
table
.
getTotalPercent
()
>
0
)
{
sum
+=
table
.
getTotalCount
()
/
table
.
getTotalPercent
();
}
old
.
setTotalPercent
((
old
.
getTotalCount
()
+
table
.
getTotalCount
())
/
sum
);
old
.
setTotalCount
(
old
.
getTotalCount
()
+
table
.
getTotalCount
());
old
.
setFailCount
(
old
.
getFailCount
()
+
table
.
getFailCount
());
old
.
setFailPercent
(
old
.
getFailCount
()
/
(
double
)
old
.
getTotalCount
());
old
.
setSum
(
old
.
getSum
()
+
table
.
getSum
());
old
.
setAvg
(
old
.
getSum
()
/
(
double
)
old
.
getTotalCount
());
}
@Override
protected
void
mergeMethod
(
Method
old
,
Method
method
)
{
double
sum
=
0
;
if
(
old
.
getTotalPercent
()
>
0
)
{
sum
+=
old
.
getTotalCount
()
/
old
.
getTotalPercent
();
}
if
(
method
.
getTotalPercent
()
>
0
)
{
sum
+=
method
.
getTotalCount
()
/
method
.
getTotalPercent
();
}
old
.
setTotalPercent
((
old
.
getTotalCount
()
+
method
.
getTotalCount
())
/
sum
);
old
.
setTotalCount
(
old
.
getTotalCount
()
+
method
.
getTotalCount
());
old
.
setFailCount
(
old
.
getFailCount
()
+
method
.
getFailCount
());
old
.
setFailPercent
(
old
.
getFailCount
()
/
(
double
)
old
.
getTotalCount
());
old
.
setSum
(
old
.
getSum
()
+
method
.
getSum
());
old
.
setAvg
(
old
.
getSum
()
/
(
double
)
old
.
getTotalCount
());
}
@Override
protected
void
mergeDatabaseReport
(
DatabaseReport
old
,
DatabaseReport
databaseReport
)
{
old
.
getDomainNames
().
addAll
(
databaseReport
.
getDomainNames
());
old
.
getDatabaseNames
().
addAll
(
databaseReport
.
getDatabaseNames
());
super
.
mergeDatabaseReport
(
old
,
databaseReport
);
}
@Override
public
void
visitDatabaseReport
(
DatabaseReport
databaseReport
)
{
DatabaseReport
old
=
getDatabaseReport
();
if
(
m_allDomain
)
{
m_all
=
old
.
findOrCreateDomain
(
CatString
.
ALL_Domain
);
}
super
.
visitDatabaseReport
(
databaseReport
);
old
.
getDomainNames
().
addAll
(
databaseReport
.
getDomainNames
());
old
.
getDatabaseNames
().
addAll
(
databaseReport
.
getDatabaseNames
());
if
(
m_allDomain
){
old
.
getDomainNames
().
remove
(
CatString
.
ALL_Domain
);
}
}
public
void
setAllDomain
(
boolean
allDomain
)
{
m_allDomain
=
true
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/model/database/HistoricalDatabaseService.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.model.database
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Set
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.consumer.database.model.transform.DefaultSaxParser
;
import
com.dianping.cat.hadoop.dal.Report
;
import
com.dianping.cat.hadoop.dal.ReportDao
;
import
com.dianping.cat.hadoop.dal.ReportEntity
;
import
com.dianping.cat.report.page.model.spi.ModelRequest
;
import
com.dianping.cat.report.page.model.spi.internal.BaseHistoricalModelService
;
import
com.dianping.cat.storage.Bucket
;
import
com.dianping.cat.storage.BucketManager
;
import
com.site.lookup.annotation.Inject
;
public
class
HistoricalDatabaseService
extends
BaseHistoricalModelService
<
DatabaseReport
>
{
@Inject
private
BucketManager
m_bucketManager
;
@Inject
private
ReportDao
m_reportDao
;
public
HistoricalDatabaseService
()
{
super
(
"database"
);
}
@Override
protected
DatabaseReport
buildModel
(
ModelRequest
request
)
throws
Exception
{
String
domain
=
request
.
getDomain
();
long
date
=
Long
.
parseLong
(
request
.
getProperty
(
"date"
));
DatabaseReport
report
;
if
(
isLocalMode
())
{
report
=
getReportFromLocalDisk
(
date
,
domain
);
}
else
{
report
=
getReportFromDatabase
(
date
,
domain
);
}
return
report
;
}
private
DatabaseReport
getReportFromDatabase
(
long
timestamp
,
String
domain
)
throws
Exception
{
List
<
Report
>
reports
=
m_reportDao
.
findAllByPeriodDomainTypeName
(
new
Date
(
timestamp
),
domain
,
1
,
getName
(),
ReportEntity
.
READSET_FULL
);
DatabaseReportMerger
merger
=
new
DatabaseReportMerger
(
new
DatabaseReport
(
domain
));
for
(
Report
report
:
reports
)
{
String
xml
=
report
.
getContent
();
DatabaseReport
model
=
DefaultSaxParser
.
parse
(
xml
);
model
.
accept
(
merger
);
}
DatabaseReport
databaseReport
=
merger
.
getDatabaseReport
();
List
<
Report
>
historyReports
=
m_reportDao
.
findAllByDomainNameDuration
(
new
Date
(
timestamp
),
new
Date
(
timestamp
+
60
*
60
*
1000
),
null
,
null
,
ReportEntity
.
READSET_DOMAIN_NAME
);
if
(
databaseReport
==
null
)
{
databaseReport
=
new
DatabaseReport
(
domain
);
}
Set
<
String
>
dataBaseNames
=
databaseReport
.
getDatabaseNames
();
for
(
Report
report
:
historyReports
)
{
dataBaseNames
.
add
(
report
.
getDomain
());
}
return
databaseReport
;
}
private
DatabaseReport
getReportFromLocalDisk
(
long
timestamp
,
String
domain
)
throws
Exception
{
Bucket
<
String
>
bucket
=
m_bucketManager
.
getReportBucket
(
timestamp
,
"database"
);
String
xml
=
bucket
.
findById
(
domain
);
return
xml
==
null
?
null
:
DefaultSaxParser
.
parse
(
xml
);
}
}
cat-home/src/main/java/com/dianping/cat/report/page/model/database/LocalDatabaseService.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.model.database
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Set
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.consumer.database.model.transform.DefaultSaxParser
;
import
com.dianping.cat.hadoop.dal.Report
;
import
com.dianping.cat.hadoop.dal.ReportDao
;
import
com.dianping.cat.hadoop.dal.ReportEntity
;
import
com.dianping.cat.report.page.model.spi.ModelPeriod
;
import
com.dianping.cat.report.page.model.spi.ModelRequest
;
import
com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService
;
import
com.dianping.cat.storage.Bucket
;
import
com.dianping.cat.storage.BucketManager
;
import
com.site.lookup.annotation.Inject
;
public
class
LocalDatabaseService
extends
BaseLocalModelService
<
DatabaseReport
>
{
@Inject
private
BucketManager
m_bucketManager
;
@Inject
private
ReportDao
m_reportDao
;
public
LocalDatabaseService
()
{
super
(
"database"
);
}
private
DatabaseReport
getLocalReport
(
long
timestamp
,
String
domain
)
throws
Exception
{
Bucket
<
String
>
bucket
=
m_bucketManager
.
getReportBucket
(
timestamp
,
"database"
);
String
xml
=
bucket
.
findById
(
domain
);
return
xml
==
null
?
null
:
DefaultSaxParser
.
parse
(
xml
);
}
@Override
protected
DatabaseReport
getReport
(
ModelRequest
request
,
ModelPeriod
period
,
String
domain
)
throws
Exception
{
DatabaseReport
report
=
super
.
getReport
(
request
,
period
,
domain
);
if
(
report
==
null
&&
period
.
isLast
())
{
long
current
=
System
.
currentTimeMillis
();
long
hour
=
60
*
60
*
1000
;
long
date
=
current
-
current
%
(
hour
)
-
hour
;
report
=
getLocalReport
(
date
,
domain
);
if
(
report
==
null
)
{
report
=
new
DatabaseReport
(
domain
);
List
<
Report
>
historyReports
=
m_reportDao
.
findAllByDomainNameDuration
(
new
Date
(
hour
),
new
Date
(
hour
+
60
*
60
*
1000
),
null
,
null
,
ReportEntity
.
READSET_DOMAIN_NAME
);
Set
<
String
>
databaseNames
=
report
.
getDatabaseNames
();
for
(
Report
temp
:
historyReports
)
{
databaseNames
.
add
(
temp
.
getDomain
());
}
}
}
return
report
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/model/database/RemoteDatabaseService.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.page.model.database
;
import
java.io.IOException
;
import
org.xml.sax.SAXException
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.consumer.database.model.transform.DefaultSaxParser
;
import
com.dianping.cat.report.page.model.spi.internal.BaseRemoteModelService
;
public
class
RemoteDatabaseService
extends
BaseRemoteModelService
<
DatabaseReport
>
{
public
RemoteDatabaseService
()
{
super
(
"database"
);
}
@Override
protected
DatabaseReport
buildModel
(
String
xml
)
throws
SAXException
,
IOException
{
return
DefaultSaxParser
.
parse
(
xml
);
}
}
cat-home/src/main/java/com/dianping/cat/report/task/database/DatabaseMerger.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.task.database
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Set
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.consumer.database.model.entity.DatabaseReport
;
import
com.dianping.cat.consumer.database.model.transform.DefaultSaxParser
;
import
com.dianping.cat.hadoop.dal.Report
;
import
com.dianping.cat.report.page.model.database.DatabaseReportMerger
;
import
com.dianping.cat.report.task.ReportMerger
;
import
com.dianping.cat.report.task.TaskHelper
;
public
class
DatabaseMerger
implements
ReportMerger
<
DatabaseReport
>
{
@Override
public
DatabaseReport
mergeForDaily
(
String
reportDomain
,
List
<
Report
>
reports
,
Set
<
String
>
domains
)
{
DatabaseReportMerger
merger
=
new
DatabaseReportMerger
(
new
DatabaseReport
(
reportDomain
));
for
(
Report
report
:
reports
)
{
String
xml
=
report
.
getContent
();
try
{
DatabaseReport
model
=
DefaultSaxParser
.
parse
(
xml
);
model
.
accept
(
merger
);
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
}
}
DatabaseReport
databaseReport
=
merger
.
getDatabaseReport
();
Date
date
=
databaseReport
.
getStartTime
();
Date
end
=
new
Date
(
TaskHelper
.
tomorrowZero
(
date
).
getTime
()
-
1000
);
databaseReport
.
getDatabaseNames
().
addAll
(
domains
);
databaseReport
.
setStartTime
(
TaskHelper
.
todayZero
(
date
));
databaseReport
.
setEndTime
(
end
);
return
databaseReport
;
}
@Override
public
DatabaseReport
mergeForGraph
(
String
reportDomain
,
List
<
Report
>
reports
)
{
throw
new
RuntimeException
(
"Database report don't need graph!"
);
}
}
cat-home/src/main/java/com/dianping/cat/report/task/database/DatabaseReportBuilder.java
0 → 100644
浏览文件 @
8cd3a4cc
package
com.dianping.cat.report.task.database
;
import
java.util.Date
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Set
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.configuration.NetworkInterfaceManager
;
import
com.dianping.cat.hadoop.dal.Dailyreport
;
import
com.dianping.cat.hadoop.dal.Report
;
import
com.dianping.cat.hadoop.dal.ReportEntity
;
import
com.dianping.cat.report.task.AbstractReportBuilder
;
import
com.dianping.cat.report.task.ReportBuilder
;
import
com.dianping.cat.report.task.TaskHelper
;
import
com.site.dal.jdbc.DalException
;
import
com.site.lookup.annotation.Inject
;
public
class
DatabaseReportBuilder
extends
AbstractReportBuilder
implements
ReportBuilder
{
@Inject
private
DatabaseMerger
m_databaseMerger
;
@Override
public
boolean
buildDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
Dailyreport
report
=
getdailyReport
(
reportName
,
reportDomain
,
reportPeriod
);
m_dailyReportDao
.
insert
(
report
);
return
true
;
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
return
false
;
}
}
private
Dailyreport
getdailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
throws
DalException
{
Date
endDate
=
TaskHelper
.
tomorrowZero
(
reportPeriod
);
Set
<
String
>
domainSet
=
new
HashSet
<
String
>();
getDomainSet
(
domainSet
,
reportPeriod
,
endDate
);
List
<
Report
>
reports
=
m_reportDao
.
findAllByDomainNameDuration
(
reportPeriod
,
endDate
,
reportDomain
,
reportName
,
ReportEntity
.
READSET_FULL
);
String
content
=
m_databaseMerger
.
mergeForDaily
(
reportDomain
,
reports
,
domainSet
).
toString
();
Dailyreport
report
=
m_dailyReportDao
.
createLocal
();
report
.
setContent
(
content
);
report
.
setCreationDate
(
new
Date
());
report
.
setDomain
(
reportDomain
);
report
.
setIp
(
NetworkInterfaceManager
.
INSTANCE
.
getLocalHostAddress
());
report
.
setName
(
reportName
);
report
.
setPeriod
(
reportPeriod
);
report
.
setType
(
1
);
return
report
;
}
@Override
public
boolean
buildHourReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
){
throw
new
RuntimeException
(
"Database report don't support HourReport!"
);
}
@Override
public
boolean
redoDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
Dailyreport
report
=
getdailyReport
(
reportName
,
reportDomain
,
reportPeriod
);
clearDailyReport
(
report
);
m_dailyReportDao
.
insert
(
report
);
return
true
;
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
return
false
;
}
}
@Override
public
boolean
redoHourReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
throw
new
RuntimeException
(
"Database report don't support redo HourReport!"
);
}
}
cat-home/src/main/java/com/dianping/cat/report/view/NavigationBar.java
浏览文件 @
8cd3a4cc
...
...
@@ -33,7 +33,9 @@ public class NavigationBar {
ReportPage
.
LOGVIEW
,
ReportPage
.
MONTHREPORT
ReportPage
.
MONTHREPORT
,
ReportPage
.
DATABASE
};
}
...
...
cat-home/src/main/resources/META-INF/plexus/components.xml
浏览文件 @
8cd3a4cc
...
...
@@ -86,6 +86,10 @@
<role>
com.dianping.cat.report.task.cross.CrossMerger
</role>
<implementation>
com.dianping.cat.report.task.cross.CrossMerger
</implementation>
</component>
<component>
<role>
com.dianping.cat.report.task.database.DatabaseMerger
</role>
<implementation>
com.dianping.cat.report.task.database.DatabaseMerger
</implementation>
</component>
<component>
<role>
com.dianping.cat.report.task.transaction.TransactionReportBuilder
</role>
<implementation>
com.dianping.cat.report.task.transaction.TransactionReportBuilder
</implementation>
...
...
@@ -188,6 +192,24 @@
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.task.database.DatabaseReportBuilder
</role>
<implementation>
com.dianping.cat.report.task.database.DatabaseReportBuilder
</implementation>
<requirements>
<requirement>
<role>
com.dianping.cat.hadoop.dal.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.DailyreportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.report.task.database.DatabaseMerger
</role>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.task.cross.CrossReportBuilder
</role>
<implementation>
com.dianping.cat.report.task.cross.CrossReportBuilder
</implementation>
...
...
@@ -530,6 +552,53 @@
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hint>
database-local
</role-hint>
<implementation>
com.dianping.cat.report.page.model.database.LocalDatabaseService
</implementation>
<requirements>
<requirement>
<role>
com.dianping.cat.storage.BucketManager
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.message.spi.MessageConsumer
</role>
<role-hint>
realtime
</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hint>
database-historical
</role-hint>
<implementation>
com.dianping.cat.report.page.model.database.HistoricalDatabaseService
</implementation>
<requirements>
<requirement>
<role>
com.dianping.cat.storage.BucketManager
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.ReportDao
</role>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hint>
database
</role-hint>
<implementation>
com.dianping.cat.report.page.model.database.CompositeDatabaseService
</implementation>
<requirements>
<requirement>
<role>
com.dianping.cat.configuration.ServerConfigManager
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hints>
<role-hint>
database-historical
</role-hint>
</role-hints>
<field-name>
m_services
</field-name>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hint>
ip-local
</role-hint>
...
...
@@ -1082,6 +1151,11 @@
<role-hint>
cross-local
</role-hint>
<field-name>
m_crossService
</field-name>
</requirement>
<requirement>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hint>
database-local
</role-hint>
<field-name>
m_databaseService
</field-name>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -1241,6 +1315,23 @@
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.page.model.database.LocalDatabaseService
</role>
<implementation>
com.dianping.cat.report.page.model.database.LocalDatabaseService
</implementation>
<requirements>
<requirement>
<role>
com.dianping.cat.storage.BucketManager
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.message.spi.MessageConsumer
</role>
<role-hint>
realtime
</role-hint>
<field-name>
m_consumer
</field-name>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.page.sql.Handler
</role>
<implementation>
com.dianping.cat.report.page.sql.Handler
</implementation>
...
...
@@ -1663,5 +1754,39 @@
<role>
com.dianping.cat.report.page.cache.JspViewer
</role>
<implementation>
com.dianping.cat.report.page.cache.JspViewer
</implementation>
</component>
<component>
<role>
com.dianping.cat.report.page.database.Handler
</role>
<implementation>
com.dianping.cat.report.page.database.Handler
</implementation>
<requirements>
<requirement>
<role>
com.dianping.cat.hadoop.dal.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.report.task.database.DatabaseMerger
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.hadoop.dal.DailyreportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.report.page.database.JspViewer
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.configuration.ServerConfigManager
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.report.page.model.spi.ModelService
</role>
<role-hint>
database
</role-hint>
<field-name>
m_service
</field-name>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.report.task.database.DatabaseMerger
</role>
<implementation>
com.dianping.cat.report.task.database.DatabaseMerger
</implementation>
</component>
<component>
<role>
com.dianping.cat.report.page.database.JspViewer
</role>
<implementation>
com.dianping.cat.report.page.database.JspViewer
</implementation>
</component>
</components>
</plexus>
cat-home/src/main/resources/META-INF/wizard/webapp/wizard.xml
浏览文件 @
8cd3a4cc
...
...
@@ -50,6 +50,9 @@
<page
name=
"cache"
title=
"Cache"
path=
"cache"
>
<description>
Cache
</description>
</page>
<page
name=
"database"
title=
"Database"
path=
"database"
>
<description>
Database
</description>
</page>
</module>
</webapp>
</wizard>
...
...
cat-home/src/main/webapp/css/database.css
0 → 100644
浏览文件 @
8cd3a4cc
.database
{
font-size
:
small
;
min-width
:
50%
;
}
.database
tr
th
{
text-align
:
right
;
}
.database
.odd
td
{
background-color
:
#eee
;
font-size
:
small
;
text-align
:
right
;
}
.database
.even
td
{
background-color
:
white
;
font-size
:
small
;
text-align
:
right
;
}
.database
th
.left
{
text-align
:
left
;
}
.database
tr
.left
{
text-align
:
left
;
}
.database
tr
.left
{
text-align
:
left
;
}
\ No newline at end of file
cat-home/src/main/webapp/jsp/report/database.jsp
0 → 100644
浏览文件 @
8cd3a4cc
<%@ page
session=
"false"
language=
"java"
pageEncoding=
"UTF-8"
%>
<%@ page
contentType=
"text/html; charset=utf-8"
%>
<%@ taglib
prefix=
"a"
uri=
"/WEB-INF/app.tld"
%>
<%@ taglib
prefix=
"w"
uri=
"http://www.unidal.org/web/core"
%>
<%@ taglib
prefix=
"c"
uri=
"http://java.sun.com/jsp/jstl/core"
%>
<%@ taglib
prefix=
"res"
uri=
"http://www.unidal.org/webres"
%>
<jsp:useBean
id=
"ctx"
type=
"com.dianping.cat.report.page.database.Context"
scope=
"request"
/>
<jsp:useBean
id=
"payload"
type=
"com.dianping.cat.report.page.database.Payload"
scope=
"request"
/>
<jsp:useBean
id=
"model"
type=
"com.dianping.cat.report.page.database.Model"
scope=
"request"
/>
<c:set
var=
"report"
value=
"
${
model
.
report
}
"
/>
<a:body>
<res:bean
id=
"res"
/>
<res:useCss
value=
'
${
res
.
css
.
local
.
body_css
}
'
target=
"head-css"
/>
<res:useCss
value=
'
${
res
.
css
.
local
.
report_css
}
'
target=
"head-css"
/>
<res:useCss
value=
"
${
res
.
css
.
local
.
database_css
}
"
target=
"head-css"
/>
<res:useJs
value=
"
${
res
.
js
.
local
[
'jquery-1.7.1.js'
]
}
"
target=
"head-js"
/>
<div
class=
"report"
>
<table
class=
"header"
>
<tr>
<td
class=
"title"
>
DatabaseReport
</td>
<td
class=
"switch"
><a
href=
"${model.baseUri}?op=history&database=${model.database}"
>
Switch
To History Mode
</a></td>
<td
class=
"nav"
><c:forEach
var=
"nav"
items=
"
${
model
.
navs
}
"
>
[
<a
href=
"${model.baseUri}?database=${model.database}&date=${model.date}&step=${nav.hours}&${navUrlPrefix}"
>
${nav.title}
</a>
]
</c:forEach>
[
<a
href=
"${model.baseUri}?${navUrlPrefix}"
>
now
</a>
]
</td>
</tr>
</table>
<table
class=
"navbar"
>
<tr>
<td
class=
"database"
>
<div
class=
"database"
>
<c:forEach
var=
"database"
items=
"
${
model
.
databases
}
"
>
<c:choose>
<c:when
test=
"
${
model
.
database
eq
database
}
"
>
<a
href=
"${model.baseUri}?database=${database}&date=${model.date}"
class=
"current"
>
[
${database}
]
</a>
</c:when>
<c:otherwise>
<a
href=
"${model.baseUri}?database=${database}&date=${model.date}"
>
[
${database}
]
</a>
</c:otherwise>
</c:choose>
</c:forEach>
</div>
</td>
</tr>
</table>
</br>
<table
class=
"machines"
>
<tr
style=
"text-align: left"
>
<th>
Machines:
[
<c:choose>
<c:when
test=
"
${
model
.
domain
eq
'All'
}
"
>
<a
href=
"?database=${model.database}&date=${model.date}"
class=
"current"
>
All
</a>
</c:when>
<c:otherwise>
<a
href=
"?database=${model.database}&date=${model.date}"
>
All
</a>
</c:otherwise>
</c:choose>
]
<c:forEach
var=
"domain"
items=
"
${
model
.
domains
}
"
>
[
<c:choose>
<c:when
test=
"
${
model
.
domain
eq
domain
}
"
>
<a
href=
"?database=${model.database}&domain=${domain}&date=${model.date}"
class=
"current"
>
${domain}
</a>
</c:when>
<c:otherwise>
<a
href=
"?database=${model.database}&domain=${domain}&date=${model.date}"
>
${domain}
</a>
</c:otherwise>
</c:choose>
]
</c:forEach>
</th>
</tr>
</table>
</br>
<table
class=
"database"
>
<tr>
<th
class=
"left"
><a
href=
"${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=name"
>
Table
</a></th>
<th>
Name
</th>
<th><a
href=
"${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=total"
>
Total
</a></th>
<th><a
href=
"${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failure"
>
Failure
</a></th>
<th><a
href=
"${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=failurePercent"
>
Failure%
</a></th>
<th><a
href=
"${model.baseUri}?database=${model.database}&date=${model.date}&domain=${model.domain}&sort=avg"
>
Avg(ms)
</a></th>
<th>
TablePercent%
</th>
<th>
MethodPercent%
</th>
<th>
TPS
</th>
</tr>
<c:forEach
var=
"item"
items=
"
${
model
.
displayDatabase
.
results
}
"
varStatus=
"status"
>
<tr
class=
"odd"
>
<td
class=
"left"
>
${item.id}
</td>
<td>
</td>
<td>
${w:format(item.totalCount,'#,###,###,###,##0')}
</td>
<td>
${w:format(item.failCount,'#,###,###,###,##0')}
</td>
<td>
${w:format(item.failPercent,'0.00%')}
</td>
<td>
${w:format(item.avg,'0.00')}
</td>
<td>
${w:format(item.totalPercent,'0.00%')}
</td>
<td>
-
</td>
<td>
${w:format(item.tps,'0.00')}
</td>
</tr>
<c:forEach
var=
"methodEntry"
items=
"
${
item
.
methods
}
"
varStatus=
"status1"
>
<tr
class=
"${status1.index mod 2==0 ? 'even' : 'odd'}"
>
<c:set
var=
"method"
value=
"
${
methodEntry
.
value
}
"
/>
<td
style=
"background:white"
>
</td>
<td>
${method.id}
</td>
<td>
${w:format(method.totalCount,'#,###,###,###,##0')}
</td>
<td>
${w:format(method.failCount,'#,###,###,###,##0')}
</td>
<td>
${w:format(method.failPercent,'0.00%')}
</td>
<td>
${w:format(method.avg,'0.00')}
</td>
<td>
</td>
<td>
${w:format(method.totalPercent,'0.00%')}
</td>
<td>
${w:format(method.tps,'0.00')}
</td>
</tr>
</c:forEach>
<tr>
<td>
</td>
</tr>
</c:forEach>
</table>
<table
class=
"footer"
>
<tr>
<td>
[ end ]
</td>
</tr>
</table>
</div>
</br>
</a:body>
cat-home/src/main/webapp/jsp/report/event.jsp
浏览文件 @
8cd3a4cc
...
...
@@ -4,12 +4,9 @@
<%@ taglib
prefix=
"w"
uri=
"http://www.unidal.org/web/core"
%>
<%@ taglib
prefix=
"c"
uri=
"http://java.sun.com/jsp/jstl/core"
%>
<%@ taglib
prefix=
"res"
uri=
"http://www.unidal.org/webres"
%>
<jsp:useBean
id=
"ctx"
type=
"com.dianping.cat.report.page.event.Context"
scope=
"request"
/>
<jsp:useBean
id=
"payload"
type=
"com.dianping.cat.report.page.event.Payload"
scope=
"request"
/>
<jsp:useBean
id=
"model"
type=
"com.dianping.cat.report.page.event.Model"
scope=
"request"
/>
<jsp:useBean
id=
"ctx"
type=
"com.dianping.cat.report.page.event.Context"
scope=
"request"
/>
<jsp:useBean
id=
"payload"
type=
"com.dianping.cat.report.page.event.Payload"
scope=
"request"
/>
<jsp:useBean
id=
"model"
type=
"com.dianping.cat.report.page.event.Model"
scope=
"request"
/>
<c:set
var=
"report"
value=
"
${
model
.
report
}
"
/>
<a:report
...
...
cat-home/src/test/java/com/dianping/cat/demo/TestSendMessage.java
浏览文件 @
8cd3a4cc
...
...
@@ -244,32 +244,32 @@ public class TestSendMessage {
t3
.
addData
(
"key and value"
);
t3
.
setStatus
(
Message
.
SUCCESS
);
t3
.
complete
();
Transaction
t4
=
Cat
.
getProducer
().
newTransaction
(
"Cache.memcached"
,
"Method"
+
i
%
10
);
t4
.
addData
(
"key and value"
);
t4
.
setStatus
(
Message
.
SUCCESS
);
t4
.
complete
();
Transaction
t5
=
Cat
.
getProducer
().
newTransaction
(
"Cache.memcached"
,
"Method"
+
i
%
10
);
t5
.
addData
(
"key and value"
);
t5
.
setStatus
(
Message
.
SUCCESS
);
t5
.
complete
();
Transaction
t6
=
Cat
.
getProducer
().
newTransaction
(
"Cache.memcached"
,
"Method"
+
i
%
10
);
t6
.
addData
(
"key and value"
);
t6
.
setStatus
(
Message
.
SUCCESS
);
t6
.
complete
();
Transaction
t7
=
Cat
.
getProducer
().
newTransaction
(
"Cache.memcached"
,
"Method"
+
i
%
10
);
t7
.
addData
(
"key and value"
);
t7
.
setStatus
(
Message
.
SUCCESS
);
t7
.
complete
();
Transaction
t8
=
Cat
.
getProducer
().
newTransaction
(
"Cache.memcached"
,
"Method"
+
i
%
10
);
t8
.
addData
(
"key and value"
);
t8
.
setStatus
(
Message
.
SUCCESS
);
t8
.
complete
();
Transaction
t9
=
Cat
.
getProducer
().
newTransaction
(
"Cache.memcached"
,
"Method"
+
i
%
10
);
t9
.
addData
(
"key and value"
);
t9
.
setStatus
(
Message
.
SUCCESS
);
...
...
@@ -278,4 +278,69 @@ public class TestSendMessage {
}
Thread
.
sleep
(
10
*
1000
);
}
@Test
public
void
sendSqlTransaction
()
throws
Exception
{
for
(
int
k
=
0
;
k
<
5
;
k
++)
{
for
(
int
i
=
0
;
i
<
100
;
i
++)
{
Transaction
t
=
Cat
.
getProducer
().
newTransaction
(
"SQL"
,
"User.select"
+
i
%
10
);
Cat
.
getProducer
().
newEvent
(
"SQL"
,
"Select"
).
setStatus
(
Message
.
SUCCESS
);
Cat
.
getProducer
().
newEvent
(
"SQL.database"
,
"jdbc:mysql://192.168.7.43:3306/database"
+
k
)
.
setStatus
(
Message
.
SUCCESS
);
t
.
addData
(
"select * from hostinfo"
);
t
.
setStatus
(
Message
.
SUCCESS
);
t
.
complete
();
Transaction
t2
=
Cat
.
getProducer
().
newTransaction
(
"SQL"
,
"User.insert"
+
i
%
10
);
Cat
.
getProducer
().
newEvent
(
"SQL"
,
"Update"
).
setStatus
(
Message
.
SUCCESS
);
Cat
.
getProducer
().
newEvent
(
"SQL.database"
,
"jdbc:mysql://192.168.7.43:3306/database"
+
k
)
.
setStatus
(
Message
.
SUCCESS
);
t2
.
addData
(
"update * from hostinfo"
);
t2
.
complete
();
Transaction
t3
=
Cat
.
getProducer
().
newTransaction
(
"SQL"
,
"User.delete"
+
i
%
10
);
Cat
.
getProducer
().
newEvent
(
"SQL"
,
"Delete"
).
setStatus
(
Message
.
SUCCESS
);
Cat
.
getProducer
().
newEvent
(
"SQL.database"
,
"jdbc:mysql://192.168.7.43:3306/database"
+
k
)
.
setStatus
(
Message
.
SUCCESS
);
t3
.
addData
(
"delete * from hostinfo"
);
t3
.
setStatus
(
Message
.
SUCCESS
);
t3
.
complete
();
}
}
Thread
.
sleep
(
1000
);
}
@Test
public
void
sendOtherDomainSqlTransaction
()
throws
Exception
{
for
(
int
k
=
0
;
k
<
5
;
k
++)
{
for
(
int
i
=
0
;
i
<
100
;
i
++)
{
Transaction
t
=
Cat
.
getProducer
().
newTransaction
(
"SQL"
,
"User.select"
+
i
%
10
);
Cat
.
getProducer
().
newEvent
(
"SQL"
,
"Select"
).
setStatus
(
Message
.
SUCCESS
);
Cat
.
getProducer
().
newEvent
(
"SQL.database"
,
"jdbc:mysql://192.168.7.43:3306/database"
+
k
)
.
setStatus
(
Message
.
SUCCESS
);
t
.
addData
(
"select * from hostinfo"
);
t
.
setStatus
(
Message
.
SUCCESS
);
Cat
.
getManager
().
getThreadLocalMessageTree
().
setDomain
(
"Cat"
+
k
);
t
.
complete
();
Transaction
t2
=
Cat
.
getProducer
().
newTransaction
(
"SQL"
,
"User.insert"
+
i
%
10
);
Cat
.
getProducer
().
newEvent
(
"SQL"
,
"Update"
).
setStatus
(
Message
.
SUCCESS
);
Cat
.
getProducer
().
newEvent
(
"SQL.database"
,
"jdbc:mysql://192.168.7.43:3306/database"
+
k
)
.
setStatus
(
Message
.
SUCCESS
);
t2
.
addData
(
"update * from hostinfo"
);
Cat
.
getManager
().
getThreadLocalMessageTree
().
setDomain
(
"Cat"
+
k
);
t2
.
complete
();
Transaction
t3
=
Cat
.
getProducer
().
newTransaction
(
"SQL"
,
"User.delete"
+
i
%
10
);
Cat
.
getProducer
().
newEvent
(
"SQL"
,
"Delete"
).
setStatus
(
Message
.
SUCCESS
);
Cat
.
getProducer
().
newEvent
(
"SQL.database"
,
"jdbc:mysql://192.168.7.43:3306/database"
+
k
)
.
setStatus
(
Message
.
SUCCESS
);
t3
.
addData
(
"delete * from hostinfo"
);
t3
.
setStatus
(
Message
.
SUCCESS
);
Cat
.
getManager
().
getThreadLocalMessageTree
().
setDomain
(
"Cat"
+
k
);
t3
.
complete
();
}
}
Thread
.
sleep
(
1000
);
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录