Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
梦中观雨
cat
提交
f8c05657
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,发现更多精彩内容 >>
提交
f8c05657
编写于
1月 23, 2013
作者:
Y
youyong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modify the month graph
上级
d00e86fa
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
735 addition
and
147 deletion
+735
-147
cat-core/src/main/java/com/dianping/cat/storage/dump/LocalMessageBucketManager.java
.../dianping/cat/storage/dump/LocalMessageBucketManager.java
+4
-2
cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
...n/java/com/dianping/cat/build/ComponentsConfigurator.java
+10
-9
cat-home/src/main/java/com/dianping/cat/report/page/event/HistoryGraphs.java
...ava/com/dianping/cat/report/page/event/HistoryGraphs.java
+92
-18
cat-home/src/main/java/com/dianping/cat/report/page/transaction/HistoryGraphs.java
...m/dianping/cat/report/page/transaction/HistoryGraphs.java
+106
-20
cat-home/src/main/java/com/dianping/cat/report/task/event/DailyEventGraphCreator.java
...ianping/cat/report/task/event/DailyEventGraphCreator.java
+84
-0
cat-home/src/main/java/com/dianping/cat/report/task/event/EventReportBuilder.java
...om/dianping/cat/report/task/event/EventReportBuilder.java
+39
-26
cat-home/src/main/java/com/dianping/cat/report/task/spi/AbstractReportBuilder.java
...m/dianping/cat/report/task/spi/AbstractReportBuilder.java
+7
-2
cat-home/src/main/java/com/dianping/cat/report/task/transaction/DailyTransactionGraphCreator.java
...report/task/transaction/DailyTransactionGraphCreator.java
+92
-0
cat-home/src/main/java/com/dianping/cat/report/task/transaction/TransactionGraphCreator.java
.../cat/report/task/transaction/TransactionGraphCreator.java
+0
-1
cat-home/src/main/java/com/dianping/cat/report/task/transaction/TransactionReportBuilder.java
...cat/report/task/transaction/TransactionReportBuilder.java
+43
-26
cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml
cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml
+4
-8
cat-home/src/main/resources/META-INF/plexus/components.xml
cat-home/src/main/resources/META-INF/plexus/components.xml
+72
-0
cat-home/src/main/webapp/js/trendGraph.js
cat-home/src/main/webapp/js/trendGraph.js
+15
-8
cat-home/src/main/webapp/jsp/report/home.jsp
cat-home/src/main/webapp/jsp/report/home.jsp
+12
-12
cat-home/src/main/webapp/jsp/report/transactionHistoryGraphs.jsp
...e/src/main/webapp/jsp/report/transactionHistoryGraphs.jsp
+17
-7
cat-home/src/test/java/com/dianping/cat/AllTests.java
cat-home/src/test/java/com/dianping/cat/AllTests.java
+4
-1
cat-home/src/test/java/com/dianping/cat/demo/TestMaxMessage.java
...e/src/test/java/com/dianping/cat/demo/TestMaxMessage.java
+2
-2
cat-home/src/test/java/com/dianping/cat/report/page/event/EventGraphDataTest.java
...om/dianping/cat/report/page/event/EventGraphDataTest.java
+2
-2
cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionGraphDataTest.java
...cat/report/page/transaction/TransactionGraphDataTest.java
+3
-3
cat-home/src/test/java/com/dianping/cat/report/task/transaction/DailyTransactionReportGraphTest.java
...ort/task/transaction/DailyTransactionReportGraphTest.java
+28
-0
cat-home/src/test/resources/com/dianping/cat/report/task/transaction/TransactionReportDailyGraph.xml
...t/report/task/transaction/TransactionReportDailyGraph.xml
+99
-0
未找到文件。
cat-core/src/main/java/com/dianping/cat/storage/dump/LocalMessageBucketManager.java
浏览文件 @
f8c05657
...
...
@@ -495,6 +495,7 @@ public class LocalMessageBucketManager extends ContainerHolder implements Messag
MessageBlock
block
=
m_messageBlocks
.
poll
(
5
,
TimeUnit
.
MILLISECONDS
);
if
(
block
!=
null
)
{
long
time
=
System
.
currentTimeMillis
();
String
dataFile
=
block
.
getDataFile
();
LocalMessageBucket
bucket
=
m_buckets
.
get
(
dataFile
);
...
...
@@ -508,11 +509,12 @@ public class LocalMessageBucketManager extends ContainerHolder implements Messag
new
RuntimeException
(
"Error when dumping for bucket: "
+
dataFile
+
"."
,
e
));
}
}
m_success
++;
m_serverStateManager
.
addBlockTotal
(
1
);
if
(
m_success
%
10000
==
0
)
{
if
(
(++
m_success
)
%
10000
==
0
)
{
m_logger
.
info
(
"block queue size "
+
m_messageBlocks
.
size
());
}
long
duration
=
System
.
currentTimeMillis
()
-
time
;
m_serverStateManager
.
addBlockTime
(
duration
);
}
}
}
catch
(
InterruptedException
e
)
{
...
...
cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
浏览文件 @
f8c05657
...
...
@@ -16,6 +16,7 @@ import com.dainping.cat.consumer.dal.report.ReportDao;
import
com.dainping.cat.consumer.dal.report.TaskDao
;
import
com.dianping.cat.CatHomeModule
;
import
com.dianping.cat.configuration.ServerConfigManager
;
import
com.dianping.cat.home.dal.report.DailygraphDao
;
import
com.dianping.cat.home.dal.report.DailyreportDao
;
import
com.dianping.cat.home.dal.report.GraphDao
;
import
com.dianping.cat.home.dal.report.MonthreportDao
;
...
...
@@ -105,39 +106,39 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all
.
add
(
C
(
StateMerger
.
class
));
all
.
add
(
C
(
TransactionReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
TransactionGraphCreator
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
TransactionGraphCreator
.
class
)
//
.
req
(
TransactionMerger
.
class
,
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
EventReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
EventGraphCreator
.
class
,
EventMerger
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
EventGraphCreator
.
class
,
EventMerger
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
ProblemReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
ProblemGraphCreator
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
ProblemGraphCreator
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
,
ProblemMerger
.
class
));
all
.
add
(
C
(
HeartbeatReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
HeartbeatGraphCreator
.
class
).
req
(
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
HeartbeatGraphCreator
.
class
).
req
(
HeartbeatMerger
.
class
,
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
MatrixReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
MatrixMerger
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
MatrixMerger
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
DatabaseReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
DatabaseMerger
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
DatabaseMerger
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
SqlReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
SqlMerger
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
SqlMerger
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
CrossReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
CrossMerger
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
CrossMerger
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
StateReportBuilder
.
class
)
//
.
req
(
GraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
StateMerger
.
class
)
//
.
req
(
GraphDao
.
class
,
DailygraphDao
.
class
,
ReportDao
.
class
,
DailyreportDao
.
class
,
StateMerger
.
class
)
//
.
req
(
WeeklyreportDao
.
class
,
MonthreportDao
.
class
));
all
.
add
(
C
(
TaskProducer
.
class
,
TaskProducer
.
class
)
//
...
...
cat-home/src/main/java/com/dianping/cat/report/page/event/HistoryGraphs.java
浏览文件 @
f8c05657
...
...
@@ -6,8 +6,15 @@ import java.util.HashMap;
import
java.util.List
;
import
java.util.Map
;
import
org.unidal.dal.jdbc.DalNotFoundException
;
import
org.unidal.lookup.annotation.Inject
;
import
org.unidal.lookup.util.StringUtils
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.helper.TimeUtil
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
import
com.dianping.cat.home.dal.report.DailygraphDao
;
import
com.dianping.cat.home.dal.report.DailygraphEntity
;
import
com.dianping.cat.home.dal.report.Graph
;
import
com.dianping.cat.home.dal.report.GraphDao
;
import
com.dianping.cat.home.dal.report.GraphEntity
;
...
...
@@ -15,14 +22,13 @@ import com.dianping.cat.report.page.HistoryGraphItem;
import
com.dianping.cat.report.page.event.Handler.DetailOrder
;
import
com.dianping.cat.report.page.event.Handler.SummaryOrder
;
import
org.unidal.dal.jdbc.DalNotFoundException
;
import
org.unidal.lookup.annotation.Inject
;
import
org.unidal.lookup.util.StringUtils
;
public
class
HistoryGraphs
{
@Inject
private
GraphDao
m_graphDao
;
@Inject
private
DailygraphDao
m_dailyGraphDao
;
private
void
appendArray
(
double
[]
src
,
int
index
,
String
str
,
int
size
)
{
String
[]
values
=
str
.
split
(
","
);
...
...
@@ -37,7 +43,7 @@ public class HistoryGraphs {
}
}
public
Map
<
String
,
double
[]>
buildGraphDatas
(
Date
start
,
Date
end
,
String
type
,
String
name
,
List
<
Graph
>
graphs
)
{
public
Map
<
String
,
double
[]>
buildGraphDatas
ForHour
(
Date
start
,
Date
end
,
String
type
,
String
name
,
List
<
Graph
>
graphs
)
{
Map
<
String
,
double
[]>
result
=
new
HashMap
<
String
,
double
[]>();
int
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_HOUR
*
12
);
double
[]
total_count
=
new
double
[
size
];
...
...
@@ -76,12 +82,53 @@ public class HistoryGraphs {
result
.
put
(
"failure_count"
,
failure_count
);
return
result
;
}
public
Map
<
String
,
double
[]>
buildGraphDatasForDaily
(
Date
start
,
Date
end
,
String
type
,
String
name
,
List
<
Dailygraph
>
graphs
)
{
Map
<
String
,
double
[]>
result
=
new
HashMap
<
String
,
double
[]>();
int
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
double
[]
total_count
=
new
double
[
size
];
double
[]
failure_count
=
new
double
[
size
];
private
HistoryGraphItem
buildTotal
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
String
name
)
{
if
(!
StringUtils
.
isEmpty
(
type
)
&&
StringUtils
.
isEmpty
(
name
))
{
for
(
Dailygraph
graph
:
graphs
)
{
int
indexOfperiod
=
(
int
)
((
graph
.
getPeriod
().
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
String
summaryContent
=
graph
.
getSummaryContent
();
String
[]
allLines
=
summaryContent
.
split
(
"\n"
);
for
(
int
j
=
0
;
j
<
allLines
.
length
;
j
++)
{
String
[]
records
=
allLines
[
j
].
split
(
"\t"
);
if
(
records
[
SummaryOrder
.
TYPE
.
ordinal
()].
equals
(
type
))
{
total_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
SummaryOrder
.
TOTAL_COUNT
.
ordinal
()]);
failure_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
SummaryOrder
.
FAILURE_COUNT
.
ordinal
()]);
}
}
}
}
else
if
(!
StringUtils
.
isEmpty
(
type
)
&&
!
StringUtils
.
isEmpty
(
name
))
{
for
(
Dailygraph
graph
:
graphs
)
{
int
indexOfperiod
=
(
int
)
((
graph
.
getPeriod
().
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
String
detailContent
=
graph
.
getDetailContent
();
String
[]
allLines
=
detailContent
.
split
(
"\n"
);
for
(
int
j
=
0
;
j
<
allLines
.
length
;
j
++)
{
String
[]
records
=
allLines
[
j
].
split
(
"\t"
);
if
(
records
[
DetailOrder
.
TYPE
.
ordinal
()].
equals
(
type
)
&&
records
[
DetailOrder
.
NAME
.
ordinal
()].
equals
(
name
))
{
total_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
DetailOrder
.
TOTAL_COUNT
.
ordinal
()]);
failure_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
DetailOrder
.
FAILURE_COUNT
.
ordinal
()]);
}
}
}
}
result
.
put
(
"total_count"
,
total_count
);
result
.
put
(
"failure_count"
,
failure_count
);
return
result
;
}
private
HistoryGraphItem
buildTotal
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
long
step
,
String
name
)
{
HistoryGraphItem
item
=
new
HistoryGraphItem
();
item
.
setStart
(
start
);
item
.
setSize
(
size
);
item
.
setStep
(
step
);
item
.
setTitles
(
name
+
" Hits (count)"
);
for
(
Map
<
String
,
double
[]>
data
:
datas
)
{
...
...
@@ -91,11 +138,12 @@ public class HistoryGraphs {
return
item
;
}
private
HistoryGraphItem
buildFail
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
String
name
)
{
private
HistoryGraphItem
buildFail
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
long
step
,
String
name
)
{
HistoryGraphItem
item
=
new
HistoryGraphItem
();
item
.
setStart
(
start
);
item
.
setSize
(
size
);
item
.
setStep
(
step
);
item
.
setTitles
(
name
+
" Error (count)"
);
for
(
Map
<
String
,
double
[]>
data
:
datas
)
{
...
...
@@ -113,41 +161,67 @@ public class HistoryGraphs {
int
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
*
12
/
TimeUtil
.
ONE_HOUR
);
String
queryType
=
payload
.
getReportType
();
List
<
Map
<
String
,
double
[]>>
allDatas
=
new
ArrayList
<
Map
<
String
,
double
[]>>();
long
step
=
TimeUtil
.
ONE_MINUTE
*
5
;
if
(
queryType
.
equalsIgnoreCase
(
"day"
))
{
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastDayGraph
=
getGraphDatas
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_DAY
),
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
ForHour
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastDayGraph
=
getGraphDatas
ForHour
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_DAY
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_DAY
),
model
,
payload
);
Map
<
String
,
double
[]>
lastWeekGraph
=
getGraphDatas
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
new
Date
(
Map
<
String
,
double
[]>
lastWeekGraph
=
getGraphDatas
ForHour
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
model
,
payload
);
allDatas
.
add
(
currentGraph
);
allDatas
.
add
(
lastDayGraph
);
allDatas
.
add
(
lastWeekGraph
);
}
else
if
(
queryType
.
equalsIgnoreCase
(
"week"
))
{
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastWeek
=
getGraphDatas
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
ForHour
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastWeek
=
getGraphDatas
ForHour
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
model
,
payload
);
allDatas
.
add
(
currentGraph
);
allDatas
.
add
(
lastWeek
);
}
else
if
(
queryType
.
equalsIgnoreCase
(
"month"
))
{
Map
<
String
,
double
[]>
graphData
=
getGraphDatas
(
start
,
end
,
model
,
payload
);
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
step
=
TimeUtil
.
ONE_DAY
;
Map
<
String
,
double
[]>
graphData
=
getGraphDatasFromDaily
(
start
,
end
,
model
,
payload
);
allDatas
.
add
(
graphData
);
}
else
{
throw
new
RuntimeException
(
"Error graph query type"
);
}
HistoryGraphItem
item
=
buildTotal
(
allDatas
,
start
,
size
,
display
);
HistoryGraphItem
item
=
buildTotal
(
allDatas
,
start
,
size
,
step
,
display
);
model
.
setHitTrend
(
item
.
getJsonString
());
item
=
buildFail
(
allDatas
,
start
,
size
,
display
);
item
=
buildFail
(
allDatas
,
start
,
size
,
step
,
display
);
model
.
setFailureTrend
(
item
.
getJsonString
());
}
public
Map
<
String
,
double
[]>
getGraphDatas
(
Date
start
,
Date
end
,
Model
model
,
Payload
payload
)
{
private
Map
<
String
,
double
[]>
getGraphDatasFromDaily
(
Date
start
,
Date
end
,
Model
model
,
Payload
payload
)
{
String
domain
=
model
.
getDomain
();
String
type
=
payload
.
getType
();
String
name
=
payload
.
getName
();
String
ip
=
model
.
getIpAddress
();
String
queryIp
=
"All"
.
equals
(
ip
)
==
true
?
"all"
:
ip
;
List
<
Dailygraph
>
graphs
=
new
ArrayList
<
Dailygraph
>();
for
(
long
startLong
=
start
.
getTime
();
startLong
<
end
.
getTime
();
startLong
=
startLong
+
TimeUtil
.
ONE_DAY
)
{
try
{
Dailygraph
graph
=
m_dailyGraphDao
.
findSingalByDomainNameIpDuration
(
new
Date
(
startLong
),
queryIp
,
domain
,
name
,
DailygraphEntity
.
READSET_FULL
);
graphs
.
add
(
graph
);
}
catch
(
DalNotFoundException
e
)
{
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
}
}
Map
<
String
,
double
[]>
result
=
buildGraphDatasForDaily
(
start
,
end
,
type
,
name
,
graphs
);
return
result
;
}
public
Map
<
String
,
double
[]>
getGraphDatasForHour
(
Date
start
,
Date
end
,
Model
model
,
Payload
payload
)
{
String
domain
=
model
.
getDomain
();
String
type
=
payload
.
getType
();
String
name
=
payload
.
getName
();
...
...
@@ -164,7 +238,7 @@ public class HistoryGraphs {
Cat
.
logError
(
e
);
}
}
Map
<
String
,
double
[]>
result
=
buildGraphDatas
(
start
,
end
,
type
,
name
,
events
);
Map
<
String
,
double
[]>
result
=
buildGraphDatas
ForHour
(
start
,
end
,
type
,
name
,
events
);
return
result
;
}
}
cat-home/src/main/java/com/dianping/cat/report/page/transaction/HistoryGraphs.java
浏览文件 @
f8c05657
...
...
@@ -10,8 +10,10 @@ import org.unidal.dal.jdbc.DalNotFoundException;
import
org.unidal.lookup.annotation.Inject
;
import
org.unidal.lookup.util.StringUtils
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.helper.TimeUtil
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
import
com.dianping.cat.home.dal.report.DailygraphDao
;
import
com.dianping.cat.home.dal.report.DailygraphEntity
;
import
com.dianping.cat.home.dal.report.Graph
;
import
com.dianping.cat.home.dal.report.GraphDao
;
import
com.dianping.cat.home.dal.report.GraphEntity
;
...
...
@@ -26,6 +28,9 @@ public class HistoryGraphs {
@Inject
private
GraphDao
m_graphDao
;
@Inject
private
DailygraphDao
m_dailyGraphDao
;
private
void
appendArray
(
double
[]
src
,
int
index
,
String
str
,
int
size
)
{
String
[]
values
=
str
.
split
(
","
);
if
(
values
.
length
<
size
)
{
...
...
@@ -39,7 +44,8 @@ public class HistoryGraphs {
}
}
public
Map
<
String
,
double
[]>
buildGraphDatas
(
Date
start
,
Date
end
,
String
type
,
String
name
,
List
<
Graph
>
graphs
)
{
public
Map
<
String
,
double
[]>
buildGraphDatasForHour
(
Date
start
,
Date
end
,
String
type
,
String
name
,
List
<
Graph
>
graphs
)
{
Map
<
String
,
double
[]>
result
=
new
HashMap
<
String
,
double
[]>();
int
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
*
12
/
TimeUtil
.
ONE_HOUR
);
double
[]
total_count
=
new
double
[
size
];
...
...
@@ -88,11 +94,62 @@ public class HistoryGraphs {
return
result
;
}
private
HistoryGraphItem
buildAvg
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
String
name
)
{
public
Map
<
String
,
double
[]>
buildGraphDatasForDaily
(
Date
start
,
Date
end
,
String
type
,
String
name
,
List
<
Dailygraph
>
graphs
)
{
Map
<
String
,
double
[]>
result
=
new
HashMap
<
String
,
double
[]>();
int
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
double
[]
total_count
=
new
double
[
size
];
double
[]
failure_count
=
new
double
[
size
];
double
[]
sum
=
new
double
[
size
];
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
total_count
[
i
]
=
NOTEXIST
;
failure_count
[
i
]
=
NOTEXIST
;
sum
[
i
]
=
NOTEXIST
;
}
if
(!
StringUtils
.
isEmpty
(
type
)
&&
StringUtils
.
isEmpty
(
name
))
{
for
(
Dailygraph
graph
:
graphs
)
{
int
indexOfperiod
=
(
int
)
((
graph
.
getPeriod
().
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
String
summaryContent
=
graph
.
getSummaryContent
();
String
[]
allLines
=
summaryContent
.
split
(
"\n"
);
for
(
int
j
=
0
;
j
<
allLines
.
length
;
j
++)
{
String
[]
records
=
allLines
[
j
].
split
(
"\t"
);
if
(
records
[
SummaryOrder
.
TYPE
.
ordinal
()].
equals
(
type
))
{
total_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
SummaryOrder
.
TOTAL_COUNT
.
ordinal
()]);
failure_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
SummaryOrder
.
FAILURE_COUNT
.
ordinal
()]);
sum
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
SummaryOrder
.
SUM
.
ordinal
()]);
}
}
}
}
else
if
(!
StringUtils
.
isEmpty
(
type
)
&&
!
StringUtils
.
isEmpty
(
name
))
{
for
(
Dailygraph
graph
:
graphs
)
{
int
indexOfperiod
=
(
int
)
((
graph
.
getPeriod
().
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
String
detailContent
=
graph
.
getDetailContent
();
String
[]
allLines
=
detailContent
.
split
(
"\n"
);
for
(
int
j
=
0
;
j
<
allLines
.
length
;
j
++)
{
String
[]
records
=
allLines
[
j
].
split
(
"\t"
);
if
(
records
[
DetailOrder
.
TYPE
.
ordinal
()].
equals
(
type
)
&&
records
[
DetailOrder
.
NAME
.
ordinal
()].
equals
(
name
))
{
total_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
DetailOrder
.
TOTAL_COUNT
.
ordinal
()]);
failure_count
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
DetailOrder
.
FAILURE_COUNT
.
ordinal
()]);
sum
[
indexOfperiod
]
=
Double
.
valueOf
(
records
[
DetailOrder
.
SUM
.
ordinal
()]);
}
}
}
}
result
.
put
(
"total_count"
,
total_count
);
result
.
put
(
"failure_count"
,
failure_count
);
result
.
put
(
"sum"
,
sum
);
return
result
;
}
private
HistoryGraphItem
buildAvg
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
long
step
,
String
name
)
{
HistoryGraphItem
item
=
new
HistoryGraphItem
();
item
.
setStart
(
start
);
item
.
setSize
(
size
);
item
.
setStep
(
step
);
item
.
setTitles
(
name
+
" Response Time (ms)"
);
for
(
Map
<
String
,
double
[]>
data
:
datas
)
{
...
...
@@ -109,11 +166,12 @@ public class HistoryGraphs {
return
item
;
}
private
HistoryGraphItem
buildTotal
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
String
name
)
{
private
HistoryGraphItem
buildTotal
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
long
step
,
String
name
)
{
HistoryGraphItem
item
=
new
HistoryGraphItem
();
item
.
setStart
(
start
);
item
.
setSize
(
size
);
item
.
setStep
(
step
);
item
.
setTitles
(
name
+
" Hits (count)"
);
for
(
Map
<
String
,
double
[]>
data
:
datas
)
{
...
...
@@ -123,11 +181,12 @@ public class HistoryGraphs {
return
item
;
}
private
HistoryGraphItem
buildFail
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
String
name
)
{
private
HistoryGraphItem
buildFail
(
List
<
Map
<
String
,
double
[]>>
datas
,
Date
start
,
int
size
,
long
step
,
String
name
)
{
HistoryGraphItem
item
=
new
HistoryGraphItem
();
item
.
setStart
(
start
);
item
.
setSize
(
size
);
item
.
setStep
(
step
);
item
.
setTitles
(
name
+
" Error (count)"
);
for
(
Map
<
String
,
double
[]>
data
:
datas
)
{
...
...
@@ -145,42 +204,68 @@ public class HistoryGraphs {
int
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
*
12
/
TimeUtil
.
ONE_HOUR
);
String
queryType
=
payload
.
getReportType
();
List
<
Map
<
String
,
double
[]>>
allDatas
=
new
ArrayList
<
Map
<
String
,
double
[]>>();
long
step
=
TimeUtil
.
ONE_MINUTE
*
5
;
if
(
queryType
.
equalsIgnoreCase
(
"day"
))
{
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastDayGraph
=
getGraphDatas
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_DAY
),
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
FromHour
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastDayGraph
=
getGraphDatas
FromHour
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_DAY
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_DAY
),
model
,
payload
);
Map
<
String
,
double
[]>
lastWeekGraph
=
getGraphDatas
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
model
,
payload
);
Map
<
String
,
double
[]>
lastWeekGraph
=
getGraphDatas
FromHour
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
model
,
payload
);
allDatas
.
add
(
currentGraph
);
allDatas
.
add
(
lastDayGraph
);
allDatas
.
add
(
lastWeekGraph
);
}
else
if
(
queryType
.
equalsIgnoreCase
(
"week"
))
{
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastWeek
=
getGraphDatas
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
Map
<
String
,
double
[]>
currentGraph
=
getGraphDatas
FromHour
(
start
,
end
,
model
,
payload
);
Map
<
String
,
double
[]>
lastWeek
=
getGraphDatas
FromHour
(
new
Date
(
start
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
new
Date
(
end
.
getTime
()
-
TimeUtil
.
ONE_WEEK
),
model
,
payload
);
allDatas
.
add
(
currentGraph
);
allDatas
.
add
(
lastWeek
);
}
else
if
(
queryType
.
equalsIgnoreCase
(
"month"
))
{
Map
<
String
,
double
[]>
graphData
=
getGraphDatas
(
start
,
end
,
model
,
payload
);
size
=
(
int
)
((
end
.
getTime
()
-
start
.
getTime
())
/
TimeUtil
.
ONE_DAY
);
step
=
TimeUtil
.
ONE_DAY
;
Map
<
String
,
double
[]>
graphData
=
getGraphDatasFromDaily
(
start
,
end
,
model
,
payload
);
allDatas
.
add
(
graphData
);
}
else
{
throw
new
RuntimeException
(
"Error graph query type"
);
}
HistoryGraphItem
item
=
buildAvg
(
allDatas
,
start
,
size
,
display
);
HistoryGraphItem
item
=
buildAvg
(
allDatas
,
start
,
size
,
step
,
display
);
model
.
setResponseTrend
(
item
.
getJsonString
());
item
=
buildTotal
(
allDatas
,
start
,
size
,
display
);
item
=
buildTotal
(
allDatas
,
start
,
size
,
step
,
display
);
model
.
setHitTrend
(
item
.
getJsonString
());
item
=
buildFail
(
allDatas
,
start
,
size
,
display
);
item
=
buildFail
(
allDatas
,
start
,
size
,
step
,
display
);
model
.
setErrorTrend
(
item
.
getJsonString
());
}
public
Map
<
String
,
double
[]>
getGraphDatas
(
Date
start
,
Date
end
,
Model
model
,
Payload
payload
)
{
private
Map
<
String
,
double
[]>
getGraphDatasFromDaily
(
Date
start
,
Date
end
,
Model
model
,
Payload
payload
)
{
String
domain
=
model
.
getDomain
();
String
type
=
payload
.
getType
();
String
name
=
payload
.
getName
();
String
ip
=
model
.
getIpAddress
();
String
queryIp
=
"All"
.
equals
(
ip
)
==
true
?
"all"
:
ip
;
List
<
Dailygraph
>
graphs
=
new
ArrayList
<
Dailygraph
>();
for
(
long
startLong
=
start
.
getTime
();
startLong
<
end
.
getTime
();
startLong
=
startLong
+
TimeUtil
.
ONE_DAY
)
{
try
{
Dailygraph
graph
=
m_dailyGraphDao
.
findSingalByDomainNameIpDuration
(
new
Date
(
startLong
),
queryIp
,
domain
,
"transaction"
,
DailygraphEntity
.
READSET_FULL
);
graphs
.
add
(
graph
);
}
catch
(
DalNotFoundException
e
)
{
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
//Cat.logError(e);
}
}
Map
<
String
,
double
[]>
result
=
buildGraphDatasForDaily
(
start
,
end
,
type
,
name
,
graphs
);
return
result
;
}
public
Map
<
String
,
double
[]>
getGraphDatasFromHour
(
Date
start
,
Date
end
,
Model
model
,
Payload
payload
)
{
String
domain
=
model
.
getDomain
();
String
type
=
payload
.
getType
();
String
name
=
payload
.
getName
();
...
...
@@ -195,10 +280,11 @@ public class HistoryGraphs {
graphs
.
add
(
graph
);
}
catch
(
DalNotFoundException
e
)
{
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
e
.
printStackTrace
();
//Cat.logError(e);
}
}
Map
<
String
,
double
[]>
result
=
buildGraphDatas
(
start
,
end
,
type
,
name
,
graphs
);
Map
<
String
,
double
[]>
result
=
buildGraphDatas
ForHour
(
start
,
end
,
type
,
name
,
graphs
);
return
result
;
}
}
\ No newline at end of file
cat-home/src/main/java/com/dianping/cat/report/task/event/DailyEventGraphCreator.java
0 → 100644
浏览文件 @
f8c05657
package
com.dianping.cat.report.task.event
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
com.dianping.cat.consumer.event.model.entity.EventName
;
import
com.dianping.cat.consumer.event.model.entity.EventReport
;
import
com.dianping.cat.consumer.event.model.entity.EventType
;
import
com.dianping.cat.consumer.event.model.entity.Machine
;
import
com.dianping.cat.consumer.event.model.transform.BaseVisitor
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
public
class
DailyEventGraphCreator
{
private
List
<
Dailygraph
>
m_graphs
=
new
ArrayList
<
Dailygraph
>();
private
EventReport
m_report
;
public
List
<
Dailygraph
>
buildDailygraph
(
EventReport
report
)
{
m_report
=
report
;
new
EventReportVisitor
().
visitEventReport
(
report
);
return
m_graphs
;
}
private
Dailygraph
buildDailyGraph
(
String
ip
)
{
Dailygraph
graph
=
new
Dailygraph
();
graph
.
setDomain
(
m_report
.
getDomain
());
graph
.
setPeriod
(
m_report
.
getStartTime
());
graph
.
setName
(
"event"
);
graph
.
setIp
(
ip
);
graph
.
setType
(
3
);
graph
.
setCreationDate
(
new
Date
());
return
graph
;
}
public
class
EventReportVisitor
extends
BaseVisitor
{
private
String
m_currentIp
;
private
String
m_currentType
;
private
Dailygraph
m_currentDailygraph
;
private
StringBuilder
m_summaryContent
;
private
StringBuilder
m_detailContent
;
@Override
public
void
visitMachine
(
Machine
machine
)
{
m_currentIp
=
machine
.
getIp
();
m_currentDailygraph
=
buildDailyGraph
(
m_currentIp
);
m_graphs
.
add
(
m_currentDailygraph
);
m_summaryContent
=
new
StringBuilder
();
m_detailContent
=
new
StringBuilder
();
super
.
visitMachine
(
machine
);
m_currentDailygraph
.
setDetailContent
(
m_detailContent
.
toString
());
m_currentDailygraph
.
setSummaryContent
(
m_summaryContent
.
toString
());
}
@Override
public
void
visitName
(
EventName
name
)
{
// TYPE, NAME, TOTAL_COUNT, FAILURE_COUNT
m_detailContent
.
append
(
m_currentType
).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getId
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getTotalCount
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getFailCount
()).
append
(
'\t'
).
append
(
'\n'
);
super
.
visitName
(
name
);
}
@Override
public
void
visitType
(
EventType
type
)
{
// TYPE, TOTAL_COUNT, FAILURE_COUNT
m_currentType
=
type
.
getId
();
m_summaryContent
.
append
(
type
.
getId
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getTotalCount
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getFailCount
()).
append
(
'\t'
).
append
(
'\n'
);
super
.
visitType
(
type
);
}
}
}
cat-home/src/main/java/com/dianping/cat/report/task/event/EventReportBuilder.java
浏览文件 @
f8c05657
...
...
@@ -6,6 +6,9 @@ import java.util.Date;
import
java.util.List
;
import
java.util.Set
;
import
org.unidal.dal.jdbc.DalException
;
import
org.unidal.lookup.annotation.Inject
;
import
com.dainping.cat.consumer.dal.report.Report
;
import
com.dainping.cat.consumer.dal.report.ReportEntity
;
import
com.dianping.cat.Cat
;
...
...
@@ -13,6 +16,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager;
import
com.dianping.cat.consumer.event.model.entity.EventReport
;
import
com.dianping.cat.consumer.event.model.transform.DefaultSaxParser
;
import
com.dianping.cat.helper.TimeUtil
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
import
com.dianping.cat.home.dal.report.Dailyreport
;
import
com.dianping.cat.home.dal.report.DailyreportEntity
;
import
com.dianping.cat.home.dal.report.Graph
;
...
...
@@ -22,8 +26,6 @@ import com.dianping.cat.report.page.model.event.EventReportMerger;
import
com.dianping.cat.report.task.TaskHelper
;
import
com.dianping.cat.report.task.spi.AbstractReportBuilder
;
import
com.dianping.cat.report.task.spi.ReportBuilder
;
import
org.unidal.dal.jdbc.DalException
;
import
org.unidal.lookup.annotation.Inject
;
public
class
EventReportBuilder
extends
AbstractReportBuilder
implements
ReportBuilder
{
...
...
@@ -36,7 +38,24 @@ public class EventReportBuilder extends AbstractReportBuilder implements ReportB
@Override
public
boolean
buildDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
Dailyreport
report
=
getDailyReportData
(
reportName
,
reportDomain
,
reportPeriod
);
EventReport
eventReport
=
getDailyReportData
(
reportName
,
reportDomain
,
reportPeriod
);
try
{
buildDailyEventGraph
(
eventReport
);
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
}
String
content
=
eventReport
.
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
);
m_dailyReportDao
.
insert
(
report
);
return
true
;
}
catch
(
Exception
e
)
{
...
...
@@ -44,7 +63,19 @@ public class EventReportBuilder extends AbstractReportBuilder implements ReportB
return
false
;
}
}
private
void
buildDailyEventGraph
(
EventReport
report
)
{
DailyEventGraphCreator
creator
=
new
DailyEventGraphCreator
();
List
<
Dailygraph
>
graphs
=
creator
.
buildDailygraph
(
report
);
for
(
Dailygraph
graph
:
graphs
)
{
try
{
m_dailygraphDao
.
insert
(
graph
);
}
catch
(
DalException
e
)
{
Cat
.
logError
(
e
);
}
}
}
@Override
public
boolean
buildHourReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
...
...
@@ -61,24 +92,14 @@ public class EventReportBuilder extends AbstractReportBuilder implements ReportB
return
true
;
}
private
Dailyr
eport
getDailyReportData
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
private
EventR
eport
getDailyReportData
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
throws
DalException
{
Date
endDate
=
TaskHelper
.
tomorrowZero
(
reportPeriod
);
Set
<
String
>
domainSet
=
getDomainsFromHourlyReport
(
reportPeriod
,
endDate
);
String
content
=
null
;
List
<
Report
>
reports
=
m_reportDao
.
findAllByDomainNameDuration
(
reportPeriod
,
endDate
,
reportDomain
,
reportName
,
ReportEntity
.
READSET_FULL
);
content
=
m_eventMerger
.
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
;
return
m_eventMerger
.
mergeForDaily
(
reportDomain
,
reports
,
domainSet
);
}
...
...
@@ -86,22 +107,14 @@ public class EventReportBuilder extends AbstractReportBuilder implements ReportB
List
<
Graph
>
graphs
=
new
ArrayList
<
Graph
>();
List
<
Report
>
reports
=
m_reportDao
.
findAllByPeriodDomainName
(
reportPeriod
,
reportDomain
,
reportName
,
ReportEntity
.
READSET_FULL
);
EventReport
transaction
Report
=
m_eventMerger
.
mergeForGraph
(
reportDomain
,
reports
);
graphs
=
m_eventGraphCreator
.
splitReportToGraphs
(
reportPeriod
,
reportDomain
,
reportName
,
transaction
Report
);
EventReport
event
Report
=
m_eventMerger
.
mergeForGraph
(
reportDomain
,
reports
);
graphs
=
m_eventGraphCreator
.
splitReportToGraphs
(
reportPeriod
,
reportDomain
,
reportName
,
event
Report
);
return
graphs
;
}
@Override
public
boolean
redoDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
Dailyreport
report
=
getDailyReportData
(
reportName
,
reportDomain
,
reportPeriod
);
clearDailyReport
(
report
);
m_dailyReportDao
.
insert
(
report
);
return
true
;
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
return
false
;
}
return
false
;
}
@Override
...
...
cat-home/src/main/java/com/dianping/cat/report/task/spi/AbstractReportBuilder.java
浏览文件 @
f8c05657
...
...
@@ -6,18 +6,20 @@ import java.util.HashSet;
import
java.util.List
;
import
java.util.Set
;
import
org.unidal.dal.jdbc.DalException
;
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.ReportEntity
;
import
com.dianping.cat.Cat
;
import
com.dianping.cat.home.dal.report.DailygraphDao
;
import
com.dianping.cat.home.dal.report.Dailyreport
;
import
com.dianping.cat.home.dal.report.DailyreportDao
;
import
com.dianping.cat.home.dal.report.Graph
;
import
com.dianping.cat.home.dal.report.GraphDao
;
import
com.dianping.cat.home.dal.report.MonthreportDao
;
import
com.dianping.cat.home.dal.report.WeeklyreportDao
;
import
org.unidal.dal.jdbc.DalException
;
import
org.unidal.lookup.annotation.Inject
;
public
abstract
class
AbstractReportBuilder
{
...
...
@@ -36,6 +38,9 @@ public abstract class AbstractReportBuilder {
@Inject
protected
ReportDao
m_reportDao
;
@Inject
protected
DailygraphDao
m_dailygraphDao
;
protected
void
clearDailyReport
(
Dailyreport
report
)
throws
DalException
{
m_dailyReportDao
.
deleteByDomainNamePeriod
(
report
);
}
...
...
cat-home/src/main/java/com/dianping/cat/report/task/transaction/DailyTransactionGraphCreator.java
0 → 100644
浏览文件 @
f8c05657
package
com.dianping.cat.report.task.transaction
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
com.dianping.cat.consumer.transaction.model.entity.Machine
;
import
com.dianping.cat.consumer.transaction.model.entity.TransactionName
;
import
com.dianping.cat.consumer.transaction.model.entity.TransactionReport
;
import
com.dianping.cat.consumer.transaction.model.entity.TransactionType
;
import
com.dianping.cat.consumer.transaction.model.transform.BaseVisitor
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
public
class
DailyTransactionGraphCreator
{
private
List
<
Dailygraph
>
m_graphs
=
new
ArrayList
<
Dailygraph
>();
private
TransactionReport
m_report
;
public
List
<
Dailygraph
>
buildDailygraph
(
TransactionReport
report
)
{
m_report
=
report
;
new
TransactionReportVisitor
().
visitTransactionReport
(
report
);
return
m_graphs
;
}
private
Dailygraph
buildDailyGraph
(
String
ip
)
{
Dailygraph
graph
=
new
Dailygraph
();
graph
.
setDomain
(
m_report
.
getDomain
());
graph
.
setPeriod
(
m_report
.
getStartTime
());
graph
.
setName
(
"transaction"
);
graph
.
setIp
(
ip
);
graph
.
setType
(
3
);
graph
.
setCreationDate
(
new
Date
());
return
graph
;
}
public
class
TransactionReportVisitor
extends
BaseVisitor
{
private
String
m_currentIp
;
private
String
m_currentType
;
private
Dailygraph
m_currentDailygraph
;
private
StringBuilder
m_summaryContent
;
private
StringBuilder
m_detailContent
;
@Override
public
void
visitMachine
(
Machine
machine
)
{
m_currentIp
=
machine
.
getIp
();
m_currentDailygraph
=
buildDailyGraph
(
m_currentIp
);
m_graphs
.
add
(
m_currentDailygraph
);
m_summaryContent
=
new
StringBuilder
();
m_detailContent
=
new
StringBuilder
();
super
.
visitMachine
(
machine
);
m_currentDailygraph
.
setDetailContent
(
m_detailContent
.
toString
());
m_currentDailygraph
.
setSummaryContent
(
m_summaryContent
.
toString
());
}
@Override
public
void
visitName
(
TransactionName
name
)
{
// TYPE, NAME, TOTAL_COUNT, FAILURE_COUNT, MIN, MAX, SUM, SUM2
m_detailContent
.
append
(
m_currentType
).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getId
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getTotalCount
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getFailCount
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getMin
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getMax
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getSum
()).
append
(
'\t'
);
m_detailContent
.
append
(
name
.
getSum2
()).
append
(
'\t'
).
append
(
'\n'
);
super
.
visitName
(
name
);
}
@Override
public
void
visitType
(
TransactionType
type
)
{
// TYPE, TOTAL_COUNT, FAILURE_COUNT, MIN, MAX, SUM, SUM2
m_currentType
=
type
.
getId
();
m_summaryContent
.
append
(
type
.
getId
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getTotalCount
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getFailCount
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getMin
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getMax
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getSum
()).
append
(
'\t'
);
m_summaryContent
.
append
(
type
.
getSum2
()).
append
(
'\t'
).
append
(
'\n'
);
super
.
visitType
(
type
);
}
}
}
cat-home/src/main/java/com/dianping/cat/report/task/transaction/TransactionGraphCreator.java
浏览文件 @
f8c05657
...
...
@@ -258,6 +258,5 @@ public class TransactionGraphCreator implements GraphCreator<TransactionReport>
graphs
.
add
(
allGraph
);
return
graphs
;
}
}
cat-home/src/main/java/com/dianping/cat/report/task/transaction/TransactionReportBuilder.java
浏览文件 @
f8c05657
...
...
@@ -6,6 +6,11 @@ import java.util.Date;
import
java.util.List
;
import
java.util.Set
;
import
org.codehaus.plexus.logging.LogEnabled
;
import
org.codehaus.plexus.logging.Logger
;
import
org.unidal.dal.jdbc.DalException
;
import
org.unidal.lookup.annotation.Inject
;
import
com.dainping.cat.consumer.dal.report.Report
;
import
com.dainping.cat.consumer.dal.report.ReportEntity
;
import
com.dianping.cat.Cat
;
...
...
@@ -14,6 +19,7 @@ import com.dianping.cat.consumer.transaction.TransactionReportUrlFilter;
import
com.dianping.cat.consumer.transaction.model.entity.TransactionReport
;
import
com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser
;
import
com.dianping.cat.helper.TimeUtil
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
import
com.dianping.cat.home.dal.report.Dailyreport
;
import
com.dianping.cat.home.dal.report.DailyreportEntity
;
import
com.dianping.cat.home.dal.report.Graph
;
...
...
@@ -24,11 +30,6 @@ import com.dianping.cat.report.task.TaskHelper;
import
com.dianping.cat.report.task.spi.AbstractReportBuilder
;
import
com.dianping.cat.report.task.spi.ReportBuilder
;
import
org.codehaus.plexus.logging.LogEnabled
;
import
org.codehaus.plexus.logging.Logger
;
import
org.unidal.dal.jdbc.DalException
;
import
org.unidal.lookup.annotation.Inject
;
public
class
TransactionReportBuilder
extends
AbstractReportBuilder
implements
ReportBuilder
,
LogEnabled
{
@Inject
...
...
@@ -42,8 +43,27 @@ public class TransactionReportBuilder extends AbstractReportBuilder implements R
@Override
public
boolean
buildDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
Dailyreport
report
=
getDailyReport
(
reportName
,
reportDomain
,
reportPeriod
);
TransactionReport
transactionReport
=
getDailyReport
(
reportName
,
reportDomain
,
reportPeriod
);
try
{
buildDailyTransactionGraph
(
transactionReport
);
}
catch
(
Exception
e
)
{
Cat
.
logError
(
e
);
}
String
content
=
transactionReport
.
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
);
m_dailyReportDao
.
insert
(
report
);
return
true
;
}
catch
(
Exception
e
)
{
m_logger
.
error
(
e
.
getMessage
(),
e
);
...
...
@@ -52,6 +72,19 @@ public class TransactionReportBuilder extends AbstractReportBuilder implements R
}
}
private
void
buildDailyTransactionGraph
(
TransactionReport
report
)
{
DailyTransactionGraphCreator
creator
=
new
DailyTransactionGraphCreator
();
List
<
Dailygraph
>
graphs
=
creator
.
buildDailygraph
(
report
);
for
(
Dailygraph
graph
:
graphs
)
{
try
{
m_dailygraphDao
.
insert
(
graph
);
}
catch
(
DalException
e
)
{
Cat
.
logError
(
e
);
}
}
}
@Override
public
boolean
buildHourReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
{
try
{
...
...
@@ -69,23 +102,15 @@ public class TransactionReportBuilder extends AbstractReportBuilder implements R
return
true
;
}
private
Dailyreport
getDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
throws
DalException
{
private
TransactionReport
getDailyReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
throws
DalException
{
Date
endDate
=
TaskHelper
.
tomorrowZero
(
reportPeriod
);
Set
<
String
>
domainSet
=
getDomainsFromHourlyReport
(
reportPeriod
,
endDate
);
List
<
Report
>
reports
=
m_reportDao
.
findAllByDomainNameDuration
(
reportPeriod
,
endDate
,
reportDomain
,
reportName
,
ReportEntity
.
READSET_FULL
);
String
content
=
m_transactionMerger
.
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
;
return
m_transactionMerger
.
mergeForDaily
(
reportDomain
,
reports
,
domainSet
);
}
private
List
<
Graph
>
getHourReport
(
String
reportName
,
String
reportDomain
,
Date
reportPeriod
)
throws
DalException
{
...
...
@@ -99,15 +124,7 @@ public class TransactionReportBuilder extends AbstractReportBuilder implements R
@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
;
}
return
false
;
}
@Override
...
...
cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml
浏览文件 @
f8c05657
...
...
@@ -25,13 +25,13 @@
]]>
</statement>
</query>
<query
name=
"find-report-by-domain-name-period"
type=
"SELECT"
>
<param
name=
"
start-date
"
/>
<param
name=
"
period
"
/>
<param
name=
"domain"
/>
<param
name=
"name"
/>
<statement>
<![CDATA[
SELECT <FIELDS/>
FROM
<TABLE/>
WHERE
<FIELD
name=
'period'
/>
== ${
start-date
}
WHERE
<FIELD
name=
'period'
/>
== ${
period
}
AND
<FIELD
name=
'domain'
/>
= ${domain}
AND
<FIELD
name=
'name'
/>
= ${name}
]]>
</statement>
...
...
@@ -335,9 +335,7 @@
FROM
<TABLE/>
WHERE
<FIELD
name=
'name'
/>
= ${name}
AND
<FIELD
name=
'domain'
/>
= ${domain}
<IF
type=
'NOT_NULL'
field=
'ip'
>
AND
<FIELD
name=
'ip'
/>
= ${ip}
</IF>
AND
<FIELD
name=
'ip'
/>
= ${ip}
AND
<FIELD
name=
'period'
/>
>= ${start-date}
AND
<FIELD
name=
'period'
/>
<
${end-date}
ORDER BY
<FIELD
name=
'period'
/>
ASC
...
...
@@ -353,9 +351,7 @@
FROM
<TABLE/>
WHERE
<FIELD
name=
'name'
/>
= ${name}
AND
<FIELD
name=
'domain'
/>
= ${domain}
<IF
type=
'NOT_NULL'
field=
'ip'
>
AND
<FIELD
name=
'ip'
/>
= ${ip}
</IF>
AND
<FIELD
name=
'ip'
/>
= ${ip}
AND
<FIELD
name=
'period'
/>
= ${start-date}
]]>
</statement>
</query>
...
...
cat-home/src/main/resources/META-INF/plexus/components.xml
浏览文件 @
f8c05657
...
...
@@ -93,6 +93,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -120,6 +123,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -147,6 +153,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -174,6 +183,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -201,6 +213,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -225,6 +240,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -249,6 +267,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -273,6 +294,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -297,6 +321,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
...
...
@@ -1511,6 +1538,18 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
<implementation>
com.dianping.cat.home.dal.report.DailygraphDao
</implementation>
<requirements>
<requirement>
<role>
org.unidal.dal.jdbc.QueryEngine
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -1554,6 +1593,9 @@
<requirement>
<role>
com.dianping.cat.home.dal.report.GraphDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2061,6 +2103,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2123,6 +2168,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2158,6 +2206,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2193,6 +2244,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2225,6 +2279,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2253,6 +2310,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2281,6 +2341,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2309,6 +2372,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2337,6 +2403,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
@@ -2394,6 +2463,9 @@
<requirement>
<role>
com.dainping.cat.consumer.dal.report.ReportDao
</role>
</requirement>
<requirement>
<role>
com.dianping.cat.home.dal.report.DailygraphDao
</role>
</requirement>
</requirements>
</component>
<component>
...
...
cat-home/src/main/webapp/js/trendGraph.js
浏览文件 @
f8c05657
function
graphReal
(
container
,
data
,
step
)
{
var
dataLength
=
data
.
values
.
length
;
var
real
=
data
.
values
[
0
],
size
=
data
.
size
;
var
real
=
data
.
values
[
0
],
size
=
data
.
size
;
var
start
=
new
Date
(
data
.
start
).
getTime
(),
options
,
graph
,
i
,
x
,
o
;
// [ d1, d2, d3 ]
var
allDataArray
=
[];
function
_rebuild_xy
(
line_data
){
var
_arr
=
[];
function
_rebuild_xy
(
line_data
)
{
var
_arr
=
[];
for
(
i
=
0
;
i
<
size
;
i
++
)
{
x
=
start
+
(
i
*
step
);
_arr
.
push
([
x
,
line_data
[
i
]
]);
};
}
;
return
_arr
;
};
}
;
for
(
j
=
0
;
j
<
dataLength
;
j
++
)
{
allDataArray
.
push
(
_rebuild_xy
(
data
.
values
[
j
]));
}
...
...
@@ -77,7 +78,13 @@ function graphReal(container, data, step) {
// default is five minutes
function
graph
(
container
,
data
)
{
graphReal
(
container
,
data
,
5
*
60
*
1000
);
var
step
=
data
.
step
;
if
(
step
==
0
)
{
//deafult is five minute
graphReal
(
container
,
data
,
5
*
60
*
1000
);
}
else
{
graphReal
(
container
,
data
,
step
);
}
}
function
graphPieChart
(
container
,
data
)
{
...
...
cat-home/src/main/webapp/jsp/report/home.jsp
浏览文件 @
f8c05657
...
...
@@ -21,18 +21,19 @@ Welcome to <b>Central Application Tracking (CAT)</b>.
<tr><td><a
href=
"http://wiki.dianpingoa.com/bin/view/SOA%E6%9E%B6%E6%9E%84/CAT%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C"
target=
"_blank"
>
CAT用户手册
</a></td>
</tr>
<tr><td><a
href=
"http://wiki.dianpingoa.com/bin/view/SOA%E6%9E%B6%E6%9E%84/CAT%E5%BC%80%E5%8F%91%E8%80%85%E6%96%87%E6%A1%A3"
target=
"_blank"
>
CAT开发者文档
</a></td>
</tr>
<tr><td><a
href=
"http://wiki.dianpingoa.com/bin/view/SOA%E6%9E%B6%E6%9E%84/CAT%E9%9B%86%E6%88%90%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3"
target=
"_blank"
>
CAT集成帮助文档
</a></td>
</tr>
<tr><td><a
href=
"http://10.1.8.64:8080/cat/r"
>
CAT预发环境
</a><td></tr>
<tr
height=
"20px"
><td></td></tr>
<tr><td><a
href=
"http://10.1.8.64:8080/cat/r"
>
CAT预发环境链接
</a><td></tr>
</table>
<br>
<br>
<table>
<tr><td
style=
"color:red;font-size:16px;font-weight:normal"
>
项目信息修改(修改线上环境即可),请项目负责人到Project标签下,修改项目所在分组的基本信息
</td></tr>
<tr><td
style=
"color:red;font-size:16px;font-weight:normal"
>
默认告警,邮件订阅(修改线上环境即可),请项目负责人到Alarm标签下,订阅相关异常告警、服务调用失败告警、日常邮件,Hawk会逐步下线中。
</td></tr>
<table
class=
'version'
rules=
"all"
>
<tr
class=
"even"
><td
width=
"3%"
>
序号
</td><td
width=
"87%"
>
具体功能描述
</td><td
width=
"10%"
>
发布时间
</td></tr>
<tr
class=
"odd"
><td>
1
</td><td>
项目信息修改(修改线上环境即可),请项目负责人到Project标签下,修改项目所在分组的基本信息
</td><td>
2012-09-01
</td></tr>
<tr
class=
"even"
><td>
2
</td><td>
默认告警,邮件订阅(修改线上环境即可),请项目负责人到Alarm标签下,订阅相关异常告警、服务调用失败告警、日常邮件,Hawk会逐步下线中。
</td><td>
2012-09-01
</td></tr>
<tr
class=
"odd"
><td>
3
</td><td
style=
"color:red"
>
Transaction\Event报表日报表、周报表支持趋势图对比
</td><td>
2013-01-01
</td></tr>
</table>
<br>
<br>
<table
class=
'version'
>
<tr
class=
"even"
><td>
版本
</td><td>
说明
</td><td>
发布时间
</td></tr>
<table
class=
'version'
rules=
"all"
>
<tr
class=
"even"
><td
width=
"3%"
>
版本
</td><td
width=
"87%"
>
说明
</td><td
width=
"10%"
>
发布时间
</td></tr>
<tr
class=
"odd"
><td>
0.4.1
</td><td>
1、默认禁止心跳线程获取线程锁信息,以降低对业务线程的影响。
</td><td>
2012-09-06
</td></tr>
<tr
class=
"even"
><td>
0.4.0
</td><td>
1、支持开关动态关闭。2、后端存储重构,支持分布式Logview的查看(关联pigeon的call)。
</td><td>
2012-08-20
</td></tr>
<tr
class=
"odd"
><td>
0.3.4
</td><td>
1、规范了CAT客户端的日志。2、规范了后台模块的加载顺序。3、统一服务端配置存取。4、新增心跳报表的Http线程
</td><td>
2012-07-25
</td></tr>
...
...
@@ -43,16 +44,15 @@ Welcome to <b>Central Application Tracking (CAT)</b>.
<tr
class=
"even"
><td>
0.2.5
</td><td>
1、心跳消息监控新增oldgc和newgc 2、更新了ThreadLocal的线程模型(修复了一些无头消息和部分错乱消息)
</td><td>
2012-05-01
</td></tr>
</table>
<br>
<br>
<table>
<tr
class=
"even"
><td>
序号
</td><td>
常见问题
</td><td>
解答
</td></tr>
<table
class=
'version'
rules=
"all"
>
<tr
class=
"even"
><td
width=
"3%"
>
序号
</td><td
width=
"47%"
>
常见问题
</td><td
width=
"50%"
>
问题解答
</td></tr>
<tr
class=
"odd"
><td>
1
</td><td>
TestCase跑不起来
</td><td>
升级至CAT的0.4.0的版本,Pigeon版本至1.6.1
</td></tr>
<tr
class=
"even"
><td>
2
</td><td>
集成了CAT,测试环境看不到信息
</td><td>
请Check相关步骤
<a
href=
"http://wiki.dianpingoa.com/bin/view/SOA%E6%9E%B6%E6%9E%84/CAT%E9%9B%86%E6%88%90%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3"
target=
"_blank"
>
CAT集成帮助文档
</a></td></tr>
<tr
class=
"odd"
><td>
3
</td><td>
Transaction、Event报表区间
</
<
td><td>
Transaction、Event历史报表,图表X轴以5分钟为刻度,Y轴表示每5分钟的值
</td></tr>
<tr
class=
"even"
><td>
4
</td><td>
Problem、Hearbeat报表区间
</
<
td><td>
Problem、Heartbeat历史报表,图表X轴以1分钟为刻度,Y轴表示每1分钟的值
</td></tr>
<tr
class=
"odd"
><td>
5
</td><td>
项目信息修改(仅修改线上环境)
</
<
td><td>
请项目负责人到Project标签下,修改项目所在分组的基本信息
</td></tr>
<tr
class=
"even"
><td>
6
</td><td>
默认告警,邮件订阅(仅修改线上环境)
</
<
td><td>
请项目负责人到Alarm标签下,订阅相关异常告警、服务调用失败告警、日常邮件,Hawk会逐步下线中。
</td></tr>
<tr
class=
"odd"
><td>
7
</td><td>
95Line
</
<
td><td
>
由于计算95line需要数据较多,为了减少内存开销,系统做了一些优化,在单个小时内某一台机器,95Line误差是1ms,但是合并成1一天,1周,1个月误差较大(
仅供参考)
</td></tr>
<tr
class=
"odd"
><td>
7
</td><td>
95Line
</
<
td><td
style=
"white-space:normal;"
>
由于计算95line需要数据较多,为了减少内存开销,系统做了一些优化,在单个小时内某一台机器,95Line误差是1ms,但是合并成1一天,1周,1个月误差较大(数据
仅供参考)
</td></tr>
</table>
<br>
<br>
...
...
cat-home/src/main/webapp/jsp/report/transactionHistoryGraphs.jsp
浏览文件 @
f8c05657
<%@ page
contentType=
"text/html; charset=utf-8"
%>
<%@ 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"
%>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<jsp:useBean
id=
"ctx"
type=
"com.dianping.cat.report.page.transaction.Context"
scope=
"request"
/>
<jsp:useBean
id=
"payload"
type=
"com.dianping.cat.report.page.transaction.Payload"
scope=
"request"
/>
<jsp:useBean
id=
"model"
type=
"com.dianping.cat.report.page.transaction.Model"
scope=
"request"
/>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"/cat/css/graph.css"
>
<script
type=
"text/javascript"
src=
"/cat/js/jquery-1.7.1.js"
></script>
...
...
@@ -6,13 +12,17 @@
<script
type=
"text/javascript"
src=
"/cat/js/baseTools.js"
></script>
<script
type=
"text/javascript"
src=
"/cat/js/trendGraph.js"
></script>
<table>
<tr>
<td
colspan=
"3"
>
日报表:
<a
href=
"#"
class=
"first"
>
</a>
表示From ${w:format(payload.historyStartDate,'yyyy-MM-dd HH:mm:ss')} to ${w:format(payload.historyDisplayEndDate,'yyyy-MM-dd HH:mm:ss')};
<a
href=
"#"
class=
"second"
>
</a>
表示上一天;
<a
href=
"#"
class=
"third"
>
</a>
表示上周这一天
</td>
</tr>
<tr>
<td
colspan=
"3"
>
周报表:
<a
href=
"#"
class=
"first"
>
</a>
表示当前From ${w:format(payload.historyStartDate,'yyyy-MM-dd HH:mm:ss')} to ${w:format(payload.historyDisplayEndDate,'yyyy-MM-dd HH:mm:ss')};
<a
href=
"#"
class=
"second"
>
</a>
表示上一周
</td>
</tr>
<table><c:choose>
<c:when
test=
"
${
payload
.
reportType
eq
'day'
}
"
>
<tr>
<td
colspan=
"3"
>
日报表:
<a
href=
"#"
class=
"first"
>
</a>
表示${w:format(payload.historyStartDate,'yyyy-MM-dd HH:mm')} ~ ${w:format(payload.historyDisplayEndDate,'yyyy-MM-dd HH:mm')};
<a
href=
"#"
class=
"second"
>
</a>
表示上一天;
<a
href=
"#"
class=
"third"
>
</a>
表示上周这一天
</td>
</tr>
</c:when></c:choose><c:choose>
<c:when
test=
"
${
payload
.
reportType
eq
'week'
}
"
>
<tr>
<td
colspan=
"3"
>
周报表:
<a
href=
"#"
class=
"first"
>
</a>
表示当前From ${w:format(payload.historyStartDate,'yyyy-MM-dd HH:mm')} to ${w:format(payload.historyDisplayEndDate,'yyyy-MM-dd HH:mm')};
<a
href=
"#"
class=
"second"
>
</a>
表示上一周
</td>
</tr>
</c:when></c:choose>
<tr>
<td><div
id=
"responseTrend"
class=
"graph"
></div></td>
<td><div
id=
"hitTrend"
class=
"graph"
></div></td>
...
...
cat-home/src/test/java/com/dianping/cat/AllTests.java
浏览文件 @
f8c05657
...
...
@@ -31,6 +31,7 @@ import com.dianping.cat.report.task.health.HealthReportBuilderTest;
import
com.dianping.cat.report.task.problem.ProblemCreateGraphDataTest
;
import
com.dianping.cat.report.task.problem.ProblemDailyGraphMergerTest
;
import
com.dianping.cat.report.task.problem.ProblemGraphCreatorTest
;
import
com.dianping.cat.report.task.transaction.DailyTransactionReportGraphTest
;
import
com.dianping.cat.report.task.transaction.HistoryTransactionMergerTest
;
import
com.dianping.cat.report.task.transaction.TransactionDailyGraphMergerTest
;
import
com.dianping.cat.report.task.transaction.TransactionGraphCreatorTest
;
...
...
@@ -99,6 +100,8 @@ import com.dianping.cat.system.notify.RenderTest;
/* alarm .render */
RenderTest
.
class
,
ThresholdRuleTest
.
class
,
TemplateMergerTest
.
class
,
ReportServiceImplTest
.
class
,
StateReportMergerTest
.
class
})
ReportServiceImplTest
.
class
,
StateReportMergerTest
.
class
,
DailyTransactionReportGraphTest
.
class
})
public
class
AllTests
{
}
cat-home/src/test/java/com/dianping/cat/demo/TestMaxMessage.java
浏览文件 @
f8c05657
...
...
@@ -109,7 +109,6 @@ public class TestMaxMessage {
@Test
public
void
test
()
{
System
.
out
.
println
(
testTime
(
1356973200000
l
,
1356981928482
l
));
double
ttt
=
843
E2
;
System
.
out
.
println
(
ttt
);
...
...
@@ -119,12 +118,13 @@ public class TestMaxMessage {
}
public
double
testTime
(
long
time
,
long
time2
)
{
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm"
);
System
.
out
.
println
(
sdf
.
format
(
new
Date
(
time
)));
System
.
out
.
println
(
sdf
.
format
(
new
Date
(
time2
)));
time2
=
time2
-
time2
%
(
60
*
60
*
1000
);
return
(
double
)
(
time
-
time2
)
/
(
60
*
60
*
1000.0
);
}
}
\ No newline at end of file
cat-home/src/test/java/com/dianping/cat/report/page/event/EventGraphDataTest.java
浏览文件 @
f8c05657
...
...
@@ -33,7 +33,7 @@ public class EventGraphDataTest {
Date
addtime
=
new
Date
(
time
);
graphs
.
add
(
creatGraph
(
addtime
));
}
Map
<
String
,
double
[]>
graphDatas
=
handler
.
buildGraphDatas
(
start
,
end
,
"URL"
,
""
,
graphs
);
Map
<
String
,
double
[]>
graphDatas
=
handler
.
buildGraphDatas
ForHour
(
start
,
end
,
"URL"
,
""
,
graphs
);
double
[]
total_count
=
graphDatas
.
get
(
"total_count"
);
double
[]
failure_count
=
graphDatas
.
get
(
"failure_count"
);
assertArray
(
30
,
total_count
);
...
...
@@ -54,7 +54,7 @@ public class EventGraphDataTest {
Date
addtime
=
new
Date
(
time
);
graphs
.
add
(
creatGraph
(
addtime
));
}
Map
<
String
,
double
[]>
graphDatas
=
handler
.
buildGraphDatas
(
start
,
end
,
"URL"
,
"ClientInfo"
,
graphs
);
Map
<
String
,
double
[]>
graphDatas
=
handler
.
buildGraphDatas
ForHour
(
start
,
end
,
"URL"
,
"ClientInfo"
,
graphs
);
double
[]
total_count
=
graphDatas
.
get
(
"total_count"
);
double
[]
failure_count
=
graphDatas
.
get
(
"failure_count"
);
assertArray
(
15
,
total_count
);
...
...
cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionGraphDataTest.java
浏览文件 @
f8c05657
...
...
@@ -33,7 +33,7 @@ public class TransactionGraphDataTest {
Date
end
=
sf
.
parse
(
"20120607"
);
List
<
Graph
>
graphs
=
buildGraph
(
start
,
end
);
String
type
=
"URL"
;
Map
<
String
,
double
[]>
graphDates
=
handler
.
buildGraphDatas
(
start
,
end
,
type
,
null
,
graphs
);
Map
<
String
,
double
[]>
graphDates
=
handler
.
buildGraphDatas
ForHour
(
start
,
end
,
type
,
null
,
graphs
);
double
[]
expectTotalCount
=
graphDates
.
get
(
"total_count"
);
double
[]
expectFailureCount
=
graphDates
.
get
(
"failure_count"
);
double
[]
expectSum
=
graphDates
.
get
(
"sum"
);
...
...
@@ -55,7 +55,7 @@ public class TransactionGraphDataTest {
List
<
Graph
>
graphs
=
buildGraph
(
start
,
end
);
String
type
=
"Result"
;
String
name
=
"cacheService:cacheConfigService_1.0.0:getKeyConfigurations"
;
Map
<
String
,
double
[]>
graphDates
=
handler
.
buildGraphDatas
(
start
,
end
,
type
,
name
,
graphs
);
Map
<
String
,
double
[]>
graphDates
=
handler
.
buildGraphDatas
ForHour
(
start
,
end
,
type
,
name
,
graphs
);
double
[]
expectTotalCount
=
graphDates
.
get
(
"total_count"
);
double
[]
expectFailureCount
=
graphDates
.
get
(
"failure_count"
);
double
[]
expectSum
=
graphDates
.
get
(
"sum"
);
...
...
@@ -78,7 +78,7 @@ public class TransactionGraphDataTest {
List
<
Graph
>
graphs
=
buildGraph
(
start
,
end
);
String
type
=
"Result"
;
String
name
=
"Result"
;
Map
<
String
,
double
[]>
graphDates
=
handler
.
buildGraphDatas
(
start
,
end
,
type
,
name
,
graphs
);
Map
<
String
,
double
[]>
graphDates
=
handler
.
buildGraphDatas
ForHour
(
start
,
end
,
type
,
name
,
graphs
);
double
[]
sum
=
graphDates
.
get
(
"sum"
);
assertArray
(-
1.0
,
sum
);
}
catch
(
ParseException
e
)
{
...
...
cat-home/src/test/java/com/dianping/cat/report/task/transaction/DailyTransactionReportGraphTest.java
0 → 100644
浏览文件 @
f8c05657
package
com.dianping.cat.report.task.transaction
;
import
java.util.List
;
import
junit.framework.Assert
;
import
org.junit.Test
;
import
org.unidal.webres.helper.Files
;
import
com.dianping.cat.consumer.transaction.model.entity.TransactionReport
;
import
com.dianping.cat.consumer.transaction.model.transform.DefaultDomParser
;
import
com.dianping.cat.home.dal.report.Dailygraph
;
public
class
DailyTransactionReportGraphTest
{
@Test
public
void
test
()
throws
Exception
{
String
oldXml
=
Files
.
forIO
()
.
readFrom
(
getClass
().
getResourceAsStream
(
"TransactionReportDailyGraph.xml"
),
"utf-8"
);
TransactionReport
report1
=
new
DefaultDomParser
().
parse
(
oldXml
);
DailyTransactionGraphCreator
creator
=
new
DailyTransactionGraphCreator
();
List
<
Dailygraph
>
graphs
=
creator
.
buildDailygraph
(
report1
);
Assert
.
assertEquals
(
3
,
graphs
.
size
());
}
}
cat-home/src/test/resources/com/dianping/cat/report/task/transaction/TransactionReportDailyGraph.xml
0 → 100755
浏览文件 @
f8c05657
<?xml version="1.0" encoding="utf-8"?>
<transaction-report
domain=
"Cat"
startTime=
"2012-05-17 13:00:00"
endTime=
"2012-05-17 13:59:59"
>
<domain>
Cat
</domain>
<ip>
192.168.165.1
</ip>
<ip>
192.168.165.2
</ip>
<machine
ip=
"All"
>
<type
id=
"Task1"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<name
id=
"Status1"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<range
value=
"0"
count=
"2"
sum=
"49.772000000000006"
avg=
"24.9"
fails=
"0"
/>
<duration
value=
"32"
count=
"2"
/>
</name>
</type>
<type
id=
"URL"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"79560.6"
sum2=
"3164940717.2"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"79560.00"
line95Count=
"2"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<name
id=
"model2"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"39780.3"
sum2=
"1582470358.6"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"39780.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<range
value=
"0"
count=
"1"
sum=
"39780.276"
avg=
"39780.3"
fails=
"0"
/>
<duration
value=
"65536"
count=
"1"
/>
</name>
<name
id=
"model"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"39780.3"
sum2=
"1582470358.6"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"39780.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<range
value=
"0"
count=
"1"
sum=
"39780.276"
avg=
"39780.3"
fails=
"0"
/>
<duration
value=
"65536"
count=
"1"
/>
</name>
</type>
<type
id=
"Task"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<name
id=
"Status"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<range
value=
"0"
count=
"2"
sum=
"49.772000000000006"
avg=
"24.9"
fails=
"0"
/>
<duration
value=
"32"
count=
"2"
/>
</name>
</type>
</machine>
<machine
ip=
"All1"
>
<type
id=
"Task1"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<name
id=
"Status1"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<range
value=
"0"
count=
"2"
sum=
"49.772000000000006"
avg=
"24.9"
fails=
"0"
/>
<duration
value=
"32"
count=
"2"
/>
</name>
</type>
<type
id=
"URL"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"79560.6"
sum2=
"3164940717.2"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"79560.00"
line95Count=
"2"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<name
id=
"model2"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"39780.3"
sum2=
"1582470358.6"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"39780.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<range
value=
"0"
count=
"1"
sum=
"39780.276"
avg=
"39780.3"
fails=
"0"
/>
<duration
value=
"65536"
count=
"1"
/>
</name>
<name
id=
"model"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"39780.3"
sum2=
"1582470358.6"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"39780.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<range
value=
"0"
count=
"1"
sum=
"39780.276"
avg=
"39780.3"
fails=
"0"
/>
<duration
value=
"65536"
count=
"1"
/>
</name>
</type>
<type
id=
"Task"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<name
id=
"Status"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<range
value=
"0"
count=
"2"
sum=
"49.772000000000006"
avg=
"24.9"
fails=
"0"
/>
<duration
value=
"32"
count=
"2"
/>
</name>
</type>
</machine>
<machine
ip=
"All2"
>
<type
id=
"Task1"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<name
id=
"Status1"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<range
value=
"0"
count=
"2"
sum=
"49.772000000000006"
avg=
"24.9"
fails=
"0"
/>
<duration
value=
"32"
count=
"2"
/>
</name>
</type>
<type
id=
"URL"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"79560.6"
sum2=
"3164940717.2"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"79560.00"
line95Count=
"2"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<name
id=
"model2"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"39780.3"
sum2=
"1582470358.6"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"39780.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<range
value=
"0"
count=
"1"
sum=
"39780.276"
avg=
"39780.3"
fails=
"0"
/>
<duration
value=
"65536"
count=
"1"
/>
</name>
<name
id=
"model"
totalCount=
"1"
failCount=
"0"
failPercent=
"0.00"
min=
"39780.276"
max=
"39780.276"
avg=
"39780.3"
sum=
"39780.3"
sum2=
"1582470358.6"
std=
"0.0"
tps=
"0.00"
line95Value=
"39780.00"
line95Sum=
"39780.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230896586-0
</successMessageUrl>
<range
value=
"0"
count=
"1"
sum=
"39780.276"
avg=
"39780.3"
fails=
"0"
/>
<duration
value=
"65536"
count=
"1"
/>
</name>
</type>
<type
id=
"Task"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<name
id=
"Status"
totalCount=
"2"
failCount=
"0"
failPercent=
"0.00"
min=
"21.422"
max=
"28.35"
avg=
"24.9"
sum=
"49.8"
sum2=
"1262.6"
std=
"3.5"
tps=
"0.00"
line95Value=
"28.00"
line95Sum=
"28.00"
line95Count=
"1"
>
<successMessageUrl>
Cat-c0a8a501-1337230848968-0
</successMessageUrl>
<range
value=
"0"
count=
"2"
sum=
"49.772000000000006"
avg=
"24.9"
fails=
"0"
/>
<duration
value=
"32"
count=
"2"
/>
</name>
</type>
</machine>
</transaction-report>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录