Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
enoch
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DevOps
enoch
Commits
061c81b8
Commit
061c81b8
authored
Dec 02, 2019
by
jingbo.wang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善服务状态报表功能
parent
53d16de2
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
135 additions
and
19 deletions
+135
-19
node.go
pkg/report-form/node.go
+65
-3
report_form.go
pkg/report-form/report_form.go
+23
-14
service.go
pkg/report-form/service.go
+7
-1
service_map.go
pkg/report-form/service_map.go
+40
-1
No files found.
pkg/report-form/node.go
View file @
061c81b8
...
...
@@ -3,6 +3,7 @@ package report_form
import
(
"fmt"
"git.quantgroup.cn/DevOps/enoch/pkg/glog"
"sort"
"time"
)
...
...
@@ -12,6 +13,7 @@ type Node struct {
startTime
time
.
Time
endTime
time
.
Time
//cpu
removeN100MaxCpu
int
averageCpu
int
maxCpu
int
//mem
...
...
@@ -37,10 +39,65 @@ func NewNode(serviceName string, address string, startTime time.Time, endTime ti
rtn
.
initMem
()
rtn
.
initDisk
()
rtn
.
initThread
()
rtn
.
initRemoveN100MaxCpu
()
return
rtn
}
func
(
n
*
Node
)
initRemoveN100MaxCpu
()
{
const
n100
=
3
//求count
countSqlFormat
:=
`SELECT count(system_load_average) FROM machine_info `
+
`WHERE sys_name = '%s' AND host = '%s' AND time >= %d AND time < %d;`
sql
:=
fmt
.
Sprintf
(
countSqlFormat
,
n
.
serviceName
,
n
.
address
,
n
.
startTime
.
UnixNano
(),
n
.
endTime
.
UnixNano
())
count
,
ok
:=
queryOneAndToInt
(
sql
)
if
!
ok
{
return
}
topSqlFormat
:=
`SELECT top("x", %d) from (SELECT system_load_average/processors*100 as "x" FROM machine_info `
+
`WHERE sys_name = '%s' AND host = '%s' AND time >= %d AND time < %d)`
sql
=
fmt
.
Sprintf
(
topSqlFormat
,
count
*
n100
/
100
+
1
,
n
.
serviceName
,
n
.
address
,
n
.
startTime
.
UnixNano
(),
n
.
endTime
.
UnixNano
())
resp
,
err
:=
query
(
sql
)
if
err
!=
nil
{
glog
.
Error
(
"query sql err :"
,
err
,
sql
)
return
}
if
len
(
resp
.
Results
)
!=
1
{
fmt
.
Println
(
"??3"
,
len
(
resp
.
Results
))
return
}
res
:=
resp
.
Results
[
0
]
if
len
(
res
.
Series
)
!=
1
{
return
}
row
:=
res
.
Series
[
0
]
topIdx
,
ok
:=
getModRowKeyIdx
(
"top"
,
row
)
if
!
ok
{
return
}
sort
.
Slice
(
row
.
Values
,
func
(
i
,
j
int
)
bool
{
x1
,
ok1
:=
jsonNumberToInt
(
row
.
Values
[
i
][
topIdx
])
x2
,
ok2
:=
jsonNumberToInt
(
row
.
Values
[
j
][
topIdx
])
if
!
ok1
||
!
ok2
{
return
false
}
if
x1
<
x2
{
return
true
}
return
false
})
if
len
(
row
.
Values
)
==
0
{
return
}
removeN100MaxCpu
,
ok
:=
jsonNumberToInt
(
row
.
Values
[
0
][
topIdx
])
if
!
ok
{
return
}
n
.
removeN100MaxCpu
=
removeN100MaxCpu
}
//依次返回:平均、最大
//如果获取失败返回0,0,0
func
(
n
*
Node
)
queryKey
(
key
string
)
(
int
,
int
)
{
...
...
@@ -48,13 +105,14 @@ func (n *Node) queryKey(key string) (int, int) {
sqlFormat
:=
`SELECT mean("x"), max("x") `
+
`FROM (`
+
`SELECT %s AS "x" FROM machine_info `
+
`WHERE sys_name = '%s' AND host = '%s'AND time >= %d AND time < %d`
+
`WHERE sys_name = '%s' AND host = '%s'AND time >= %d AND time < %d
`
+
`);`
sql
:=
fmt
.
Sprintf
(
sqlFormat
,
key
,
n
.
serviceName
,
n
.
address
,
n
.
startTime
.
UnixNano
(),
n
.
endTime
.
UnixNano
())
resp
,
err
:=
query
(
sql
)
if
err
!=
nil
{
glog
.
Error
(
"node query key:"
,
err
)
return
0
,
0
}
if
len
(
resp
.
Results
)
!=
1
{
return
0
,
0
...
...
@@ -124,6 +182,10 @@ func (n *Node) GetMaxCpu() int {
return
n
.
maxCpu
}
func
(
n
*
Node
)
GetRemoveN100MaxCpu
()
int
{
return
n
.
removeN100MaxCpu
}
func
(
n
*
Node
)
GetAverageMem
()
int
{
return
n
.
averageMem
}
...
...
pkg/report-form/report_form.go
View file @
061c81b8
...
...
@@ -150,8 +150,17 @@ func Run(n int) string {
rtn
.
WriteString
(
fmt
.
Sprintf
(
"总访问量:%v 总响应时间:%v 平均响应时间:%v
\n\n
"
,
sm
.
GetCount
(),
sm
.
GetSumDuration
(),
sm
.
GetAverageDuration
()))
//服务平均响应时间排行
serviceTable
:=
NewTable
(
"服务平均响应时间排行"
,
"duration"
,
"sys_name"
,
"traffic_volume"
)
serviceList
:=
sm
.
GetAverageDurationServiceList
()
for
_
,
s
:=
range
serviceList
{
_
=
serviceTable
.
AddRecord
(
s
.
GetAverageDuration
(),
s
.
Name
(),
s
.
GetCount
())
}
rtn
.
WriteString
(
serviceTable
.
ToString
())
rtn
.
WriteString
(
"
\n
"
)
//服务响应时间中位值排行
medianTable
:=
NewTable
(
"服务
响应时间中位值排行"
,
"duration"
,
"sys_name"
,
"path"
,
"count
"
)
medianTable
:=
NewTable
(
"服务
接口响应时间中位值排行"
,
"duration"
,
"sys_name"
,
"path"
,
"traffic_volume
"
)
medianList
:=
sm
.
GetMedianDurationPathList
()
for
_
,
m
:=
range
medianList
{
_
=
medianTable
.
AddRecord
(
m
.
GetMedianDuration
(),
m
.
GetServiceName
(),
m
.
GetPath
(),
m
.
GetCount
())
...
...
@@ -160,7 +169,7 @@ func Run(n int) string {
rtn
.
WriteString
(
"
\n
"
)
//服务响应时间平均值排行
averageTable
:=
NewTable
(
"服务
响应时间平均值排行"
,
"duration"
,
"sys_name"
,
"path"
,
"count
"
)
averageTable
:=
NewTable
(
"服务
接口响应时间平均值排行"
,
"duration"
,
"sys_name"
,
"path"
,
"traffic_volume
"
)
averageList
:=
sm
.
GetAverageDurationPathList
()
for
_
,
m
:=
range
averageList
{
_
=
averageTable
.
AddRecord
(
m
.
GetAverageDuration
(),
m
.
GetServiceName
(),
m
.
GetPath
(),
m
.
GetCount
())
...
...
@@ -169,7 +178,7 @@ func Run(n int) string {
rtn
.
WriteString
(
"
\n
"
)
//响应时间最长的请求排行
maxTable
:=
NewTable
(
"
响应时间最长的请求
排行"
,
"duration"
,
"sys_name"
,
"path"
,
"timestamp"
,
"trace_id"
)
maxTable
:=
NewTable
(
"
服务接口响应时间最高值
排行"
,
"duration"
,
"sys_name"
,
"path"
,
"timestamp"
,
"trace_id"
)
maxList
:=
sm
.
GetMaxDurationTracePointList
()
for
_
,
m
:=
range
maxList
{
_
=
maxTable
.
AddRecord
(
m
.
Duration
,
m
.
ServiceName
,
m
.
Path
,
m
.
Timestamp
,
m
.
TraceId
)
...
...
@@ -177,20 +186,20 @@ func Run(n int) string {
rtn
.
WriteString
(
maxTable
.
ToString
())
rtn
.
WriteString
(
"
\n
"
)
//
平均
cpu使用率排行
cpuTable
:=
NewTable
(
"平均cpu使用率排行"
,
"cpu"
,
"sys_name"
,
"count
"
,
"average_duration"
)
cpuList
:=
sm
.
GetAverage
CpuServiceList
()
for
_
,
s
:=
range
c
puList
{
if
s
.
Get
Average
Cpu
()
<
cpuMin
{
//
去topN100后的峰值
cpu使用率排行
maxRemoveN100CpuTable
:=
NewTable
(
"常规cpu使用率排行"
,
"cpu"
,
"sys_name"
,
"traffic_volume
"
,
"average_duration"
)
maxRemoveN100CpuList
:=
sm
.
GetRemoveN100Max
CpuServiceList
()
for
_
,
s
:=
range
maxRemoveN100C
puList
{
if
s
.
Get
RemoveN100Max
Cpu
()
<
cpuMin
{
break
}
_
=
cpuTable
.
AddRecord
(
s
.
GetAverage
Cpu
(),
s
.
Name
(),
s
.
GetCount
(),
s
.
GetAverageDuration
())
_
=
maxRemoveN100CpuTable
.
AddRecord
(
s
.
GetRemoveN100Max
Cpu
(),
s
.
Name
(),
s
.
GetCount
(),
s
.
GetAverageDuration
())
}
rtn
.
WriteString
(
c
puTable
.
ToString
())
rtn
.
WriteString
(
maxRemoveN100C
puTable
.
ToString
())
rtn
.
WriteString
(
"
\n
"
)
//
平均
cpu使用率排行
maxCpuTable
:=
NewTable
(
"峰值cpu使用率排行"
,
"cpu"
,
"sys_name"
,
"
count
"
,
"average_duration"
)
//
峰值
cpu使用率排行
maxCpuTable
:=
NewTable
(
"峰值cpu使用率排行"
,
"cpu"
,
"sys_name"
,
"
traffic_volume
"
,
"average_duration"
)
maxCpuList
:=
sm
.
GetMaxCpuServiceList
()
for
_
,
s
:=
range
maxCpuList
{
if
s
.
GetMaxCpu
()
<
cpuMin
{
...
...
@@ -202,7 +211,7 @@ func Run(n int) string {
rtn
.
WriteString
(
"
\n
"
)
//内存峰值使用率排行
memTable
:=
NewTable
(
"峰值内存使用率排行"
,
"mem"
,
"sys_name"
,
"
count
"
,
"average_duration"
)
memTable
:=
NewTable
(
"峰值内存使用率排行"
,
"mem"
,
"sys_name"
,
"
traffic_volume
"
,
"average_duration"
)
memList
:=
sm
.
GetMaxMemServiceList
()
for
_
,
s
:=
range
memList
{
if
s
.
GetMaxMem
()
<
memMin
{
...
...
@@ -214,7 +223,7 @@ func Run(n int) string {
rtn
.
WriteString
(
"
\n
"
)
//硬盘峰值使用率排行
diskTable
:=
NewTable
(
"峰值硬盘使用率排行"
,
"disk"
,
"sys_name"
,
"
count
"
,
"average_duration"
)
diskTable
:=
NewTable
(
"峰值硬盘使用率排行"
,
"disk"
,
"sys_name"
,
"
traffic_volume
"
,
"average_duration"
)
diskList
:=
sm
.
GetMaxDiskServiceList
()
for
_
,
s
:=
range
diskList
{
if
s
.
GetMaxDisk
()
<
diskMin
{
...
...
pkg/report-form/service.go
View file @
061c81b8
...
...
@@ -58,7 +58,7 @@ func NewService(name string, startTime time.Time, endTime time.Time) *Service {
if
_
,
ok
:=
IgnorePathMap
[
strings
.
ToLower
(
pathSplit
[
1
])];
ok
{
continue
}
glog
.
Info
(
"init path:
"
,
rtn
.
name
,
path
)
glog
.
Info
(
"init path:
"
,
rtn
.
name
,
" "
,
path
)
pathObj
,
ok
:=
NewPath
(
rtn
.
name
,
path
,
rtn
.
startTime
,
rtn
.
endTime
)
if
!
ok
{
continue
...
...
@@ -244,6 +244,12 @@ func (s *Service) GetAverageCpu() int {
})
}
func
(
s
*
Service
)
GetRemoveN100MaxCpu
()
int
{
return
s
.
getNodeMapValue
(
func
(
node
*
Node
)
int
{
return
node
.
GetRemoveN100MaxCpu
()
})
}
func
(
s
*
Service
)
GetMaxCpu
()
int
{
return
s
.
getNodeMapValue
(
func
(
node
*
Node
)
int
{
return
node
.
GetMaxCpu
()
...
...
pkg/report-form/service_map.go
View file @
061c81b8
...
...
@@ -75,7 +75,24 @@ func (sm *ServiceMap) GetAverageCpuServiceList() []*Service {
return
rtn
}
//峰值平均cpu使用率列表
//去N100后的峰值cpu使用率列表
func
(
sm
*
ServiceMap
)
GetRemoveN100MaxCpuServiceList
()
[]
*
Service
{
rtn
:=
make
([]
*
Service
,
0
)
for
_
,
s
:=
range
sm
.
serviceMap
{
rtn
=
append
(
rtn
,
s
)
}
sort
.
Slice
(
rtn
,
func
(
i
,
j
int
)
bool
{
if
rtn
[
i
]
.
GetRemoveN100MaxCpu
()
>
rtn
[
j
]
.
GetRemoveN100MaxCpu
()
{
return
true
}
return
false
})
return
rtn
}
//峰值cpu使用率列表
func
(
sm
*
ServiceMap
)
GetMaxCpuServiceList
()
[]
*
Service
{
rtn
:=
make
([]
*
Service
,
0
)
for
_
,
s
:=
range
sm
.
serviceMap
{
...
...
@@ -126,6 +143,28 @@ func (sm *ServiceMap) GetMaxDiskServiceList() []*Service {
return
rtn
}
//服务平均响应时间排行
func
(
sm
*
ServiceMap
)
GetAverageDurationServiceList
()
[]
*
Service
{
rtn
:=
make
([]
*
Service
,
0
)
for
_
,
s
:=
range
sm
.
serviceMap
{
//屏蔽掉访问量为0的服务
if
s
.
GetCount
()
==
0
{
continue
}
rtn
=
append
(
rtn
,
s
)
}
sort
.
Slice
(
rtn
,
func
(
i
,
j
int
)
bool
{
if
rtn
[
i
]
.
GetAverageDuration
()
>
rtn
[
j
]
.
GetAverageDuration
()
{
return
true
}
return
false
})
return
rtn
}
//获取最大中位响应时间列表
func
(
sm
*
ServiceMap
)
GetMedianDurationPathList
()
[]
*
Path
{
rtn
:=
make
([]
*
Path
,
0
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment