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
d4d8e8ed
Commit
d4d8e8ed
authored
Nov 28, 2019
by
jingbo.wang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
总表 ok
parent
1e31f279
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
175 additions
and
32 deletions
+175
-32
report_form.go
pkg/report-form/report_form.go
+160
-30
report_form_test.go
pkg/report-form/report_form_test.go
+15
-2
No files found.
pkg/report-form/report_form.go
View file @
d4d8e8ed
package
report_form
import
(
"errors"
"fmt"
"
git.quantgroup.cn/DevOps/enoch/pkg/glog
"
"
strings
"
"time"
"unicode/utf8"
)
func
Run
()
{
type
Table
struct
{
name
string
keyList
[]
string
maxLenValueList
[]
int
recordList
[][]
string
}
func
NewTable
(
name
string
,
keys
...
string
)
*
Table
{
maxLenValueList
:=
make
([]
int
,
len
(
keys
))
for
i
,
key
:=
range
keys
{
maxLenValueList
[
i
]
=
strFormatLen
(
key
)
}
return
&
Table
{
name
:
name
,
keyList
:
keys
,
recordList
:
make
([][]
string
,
0
),
maxLenValueList
:
maxLenValueList
,
}
}
func
strFormatLen
(
s
string
)
int
{
l
:=
0
for
i
:=
0
;
i
<
len
(
s
);
{
_
,
size
:=
utf8
.
DecodeRuneInString
(
s
[
i
:
])
if
size
!=
1
{
l
+=
2
}
else
{
l
++
}
i
+=
size
}
return
l
}
func
(
t
*
Table
)
ToString
()
string
{
const
spacing
=
4
rtn
:=
new
(
strings
.
Builder
)
//标题
totalLength
:=
spacing
*
(
len
(
t
.
maxLenValueList
)
-
1
)
for
_
,
valueLen
:=
range
t
.
maxLenValueList
{
totalLength
+=
valueLen
}
preBlankLen
:=
(
totalLength
-
strFormatLen
(
t
.
name
))
/
2
postBlankLen
:=
totalLength
-
preBlankLen
-
strFormatLen
(
t
.
name
)
for
i
:=
0
;
i
<
preBlankLen
;
i
++
{
rtn
.
WriteString
(
"-"
)
}
rtn
.
WriteString
(
t
.
name
)
for
i
:=
0
;
i
<
postBlankLen
;
i
++
{
rtn
.
WriteString
(
"-"
)
}
rtn
.
WriteString
(
"
\n
"
)
//key
for
i
,
key
:=
range
t
.
keyList
{
rtn
.
WriteString
(
key
)
//补全空格,最后一行结尾不打印分隔空白
blankLen
:=
t
.
maxLenValueList
[
i
]
-
strFormatLen
(
key
)
+
spacing
if
i
==
len
(
t
.
keyList
)
-
1
{
blankLen
-=
spacing
}
for
i
:=
0
;
i
<
blankLen
;
i
++
{
rtn
.
WriteString
(
" "
)
}
}
rtn
.
WriteString
(
"
\n
"
)
//value
for
_
,
valueList
:=
range
t
.
recordList
{
for
i
,
value
:=
range
valueList
{
rtn
.
WriteString
(
value
)
blankLen
:=
t
.
maxLenValueList
[
i
]
-
strFormatLen
(
value
)
+
spacing
if
i
==
len
(
t
.
keyList
)
-
1
{
blankLen
-=
spacing
}
for
i
:=
0
;
i
<
blankLen
;
i
++
{
rtn
.
WriteString
(
" "
)
}
}
rtn
.
WriteString
(
"
\n
"
)
}
return
rtn
.
String
()
}
//添加记录
func
(
t
*
Table
)
AddRecord
(
values
...
interface
{})
error
{
if
len
(
values
)
!=
len
(
t
.
keyList
)
{
return
errors
.
New
(
"len(values) != len(keyList)"
)
}
//interface转string,并且记录最大长度
valueList
:=
make
([]
string
,
0
)
for
i
,
v
:=
range
values
{
value
:=
fmt
.
Sprint
(
v
)
valueList
=
append
(
valueList
,
value
)
if
strFormatLen
(
value
)
>
t
.
maxLenValueList
[
i
]
{
t
.
maxLenValueList
[
i
]
=
strFormatLen
(
value
)
}
}
t
.
recordList
=
append
(
t
.
recordList
,
valueList
)
return
nil
}
func
Run
(
n
int
)
string
{
//求前n天的数据,按天取整
now
:=
time
.
Now
()
startTime
:=
now
.
Add
(
-
1
*
time
.
Duration
(
now
.
Hour
())
*
time
.
Hour
)
startTime
=
startTime
.
Add
(
-
1
*
time
.
Duration
(
now
.
Minute
())
*
time
.
Minute
)
startTime
=
startTime
.
Add
(
-
1
*
time
.
Duration
(
now
.
Second
())
*
time
.
Second
)
startTime
=
startTime
.
Add
(
-
1
*
time
.
Duration
(
now
.
Nanosecond
()))
startTime
=
startTime
.
AddDate
(
0
,
0
,
-
7
)
endTime
:=
startTime
.
AddDate
(
0
,
0
,
7
)
glog
.
Info
(
"startTime:"
,
startTime
.
UnixNano
(),
" endTime:"
,
endTime
.
UnixNano
())
startTime
=
startTime
.
AddDate
(
0
,
0
,
-
n
)
endTime
:=
startTime
.
AddDate
(
0
,
0
,
n
)
//查询
sm
:=
NewServiceMap
(
startTime
,
endTime
)
fmt
.
Println
(
sm
.
GetCount
())
/*
t.Log("访问量:", sm.GetCount())
t.Log("总访问时间:", sm.GetSumDuration())
t.Log("总平均访问时间:", sm.GetAverageDuration())
t.Log("------------------median-------------------")
medianList := sm.GetMedianDurationPathList()
t.Log("服务数量:", len(medianList))
for _, m := range medianList {
t.Log(m.GetMedianDuration(), m.GetServiceName(), m.GetPath(), m.GetCount())
}
t.Log("------------------average------------------")
averageList := sm.GetAverageDurationPathList()
t.Log("服务数量:", len(averageList))
for _, m := range averageList {
t.Log(m.GetAverageDuration(), m.GetServiceName(), m.GetPath(), m.GetCount())
}
t.Log("------------------max----------------------")
maxList := sm.GetMaxDurationTracePointList()
t.Log("服务数量:", len(maxList))
for _, m := range maxList {
t.Log(m.Duration, m.ServiceName, m.Path, m.Timestamp, m.TraceId)
}
*/
//生成报表
rtn
:=
new
(
strings
.
Builder
)
//表头
rtn
.
WriteString
(
" 服务健康状态总表
\n
"
)
//时间
rtn
.
WriteString
(
fmt
.
Sprintf
(
"时间:%s ~ %s
\n
"
,
startTime
.
Format
(
time
.
RFC3339
),
endTime
.
Format
(
time
.
RFC3339
)))
//访问量
rtn
.
WriteString
(
fmt
.
Sprintf
(
"总访问量:%v 总响应时间:%v 平均响应时间:%v
\n\n
"
,
sm
.
GetCount
(),
sm
.
GetSumDuration
(),
sm
.
GetAverageDuration
()))
//服务响应时间中位值排行
medianTable
:=
NewTable
(
"服务响应时间中位值排行"
,
"duration"
,
"sys_name"
,
"path"
,
"count"
)
medianList
:=
sm
.
GetMedianDurationPathList
()
for
_
,
m
:=
range
medianList
{
_
=
medianTable
.
AddRecord
(
m
.
GetMedianDuration
(),
m
.
GetServiceName
(),
m
.
GetPath
(),
m
.
GetCount
())
}
rtn
.
WriteString
(
medianTable
.
ToString
())
rtn
.
WriteString
(
"
\n
"
)
//服务响应时间平均值排行
averageTable
:=
NewTable
(
"服务响应时间平均值排行"
,
"duration"
,
"sys_name"
,
"path"
,
"count"
)
averageList
:=
sm
.
GetAverageDurationPathList
()
for
_
,
m
:=
range
averageList
{
_
=
averageTable
.
AddRecord
(
m
.
GetAverageDuration
(),
m
.
GetServiceName
(),
m
.
GetPath
(),
m
.
GetCount
())
}
rtn
.
WriteString
(
averageTable
.
ToString
())
rtn
.
WriteString
(
"
\n
"
)
//响应时间最长的请求排行
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
)
}
rtn
.
WriteString
(
maxTable
.
ToString
())
rtn
.
WriteString
(
"
\n
"
)
return
rtn
.
String
()
}
pkg/report-form/report_form_test.go
View file @
d4d8e8ed
package
report_form
import
"testing"
import
(
"fmt"
"testing"
"unicode/utf8"
)
func
TestRun
(
t
*
testing
.
T
)
{
Run
()
fmt
.
Println
(
Run
(
10
))
}
func
TestUtf8StringLen
(
t
*
testing
.
T
)
{
s
:=
"你好,world"
for
i
:=
0
;
i
<
len
(
s
);
{
r
,
size
:=
utf8
.
DecodeRuneInString
(
s
[
i
:
])
fmt
.
Println
(
string
(
r
),
size
)
i
+=
size
}
}
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