Commit 6f581e80 authored by jingbo.wang's avatar jingbo.wang

每天0点定时拉取数据生成报表,完成

parent 463e2b06
package report_form package report_form
/* import (
var ( "git.quantgroup.cn/DevOps/enoch/pkg/glog"
receiverList = make([]string, 0) "github.com/vrg0/go-common/util"
serviceOwner = make(map[string][]string) "io/ioutil"
"os"
"runtime/debug"
"time"
) )
func init() { //定期报表,保存到指定文件夹
global.Config.Watch(global.NamespaceApplication, "report.form.receiver", func(oldCfg string, newCfg string) {
rList := make([]string, 0)
if err := json.Unmarshal([]byte(newCfg), &rList); err != nil {
glog.Error("can not unmarshal json:", err, " ", newCfg)
return
}
receiverList = rList
})
global.Config.Watch(global.NamespaceApplication, "service.owner", func(oldCfg string, newCfg string) {
obj := make(map[string][]string)
if err := json.Unmarshal([]byte(newCfg), &obj); err != nil {
glog.Error("can not unmarshal json:", err, " ", newCfg)
return
}
serviceOwner = obj
})
}
//保存服务报表的目录
func RegularReport(dir string) { func RegularReport(dir string) {
if !util.IsDir(dir) { if !util.IsDir(dir) {
return return
...@@ -37,6 +20,7 @@ func RegularReport(dir string) { ...@@ -37,6 +20,7 @@ func RegularReport(dir string) {
if err := recover(); err != nil { if err := recover(); err != nil {
glog.Error(err, "\n", string(debug.Stack())) glog.Error(err, "\n", string(debug.Stack()))
} }
}() }()
timer := time.NewTimer(0) timer := time.NewTimer(0)
...@@ -44,7 +28,6 @@ func RegularReport(dir string) { ...@@ -44,7 +28,6 @@ func RegularReport(dir string) {
<-timer.C <-timer.C
now := time.Now() now := time.Now()
//报表
run(now, dir) run(now, dir)
next := now.Add(time.Hour * 24) next := now.Add(time.Hour * 24)
...@@ -56,7 +39,59 @@ func RegularReport(dir string) { ...@@ -56,7 +39,59 @@ func RegularReport(dir string) {
func run(now time.Time, dir string) { func run(now time.Time, dir string) {
fileNamePrefix := now.Format("2006-01-02") fileNamePrefix := now.Format("2006-01-02")
dir = dir + "/" + fileNamePrefix
dirDay := dir + "/" + "day"
dirWeek := dir + "/" + "week"
if util.Exists(fileNamePrefix) {
return
} else {
if err := os.Mkdir(dir, os.ModePerm); err != nil {
glog.Error("创建dir失败:", dir, ":", err)
return
}
}
//周表
if err := os.Mkdir(dirWeek, os.ModePerm); err != nil {
glog.Error("创建dir失败:", dirWeek, ":", err)
return
} else {
reportForm(now, dirWeek, 7)
}
//日表
if err := os.Mkdir(dirDay, os.ModePerm); err != nil {
glog.Error("创建dir失败:", dirDay, ":", err)
return
} else {
reportForm(now, dirDay, 1)
}
}
func reportForm(t time.Time, dir string, n int) {
startTime := t.Add(-1 * time.Duration(t.Hour()) * time.Hour)
startTime = startTime.Add(-1 * time.Duration(t.Minute()) * time.Minute)
startTime = startTime.Add(-1 * time.Duration(t.Second()) * time.Second)
startTime = startTime.Add(-1 * time.Duration(t.Nanosecond()))
startTime = startTime.AddDate(0, 0, -n)
endTime := startTime.AddDate(0, 0, n)
sm := NewServiceMap(startTime, endTime)
all := sm.ServiceMapReportForm()
if err := ioutil.WriteFile(dir+"/all.html", []byte(all), os.ModePerm); err != nil {
glog.Error("写入文件失败", dir+"/all.html", " ", err)
return
}
}
// fileNamePrefix := now.Format("2006-01-02")
//周表
// if now.Weekday() == time.Monday {
// week()
// }
/*
//周表 //周表
if now.Weekday() == time.Tuesday { if now.Weekday() == time.Tuesday {
sm := GeneralTableNewSM(7) sm := GeneralTableNewSM(7)
...@@ -92,5 +127,32 @@ func run(now time.Time, dir string) { ...@@ -92,5 +127,32 @@ func run(now time.Time, dir string) {
} }
} }
} }
*/
/*
var (
receiverList = make([]string, 0)
serviceOwner = make(map[string][]string)
)
func init() {
global.Config.Watch(global.NamespaceApplication, "report.form.receiver", func(oldCfg string, newCfg string) {
rList := make([]string, 0)
if err := json.Unmarshal([]byte(newCfg), &rList); err != nil {
glog.Error("can not unmarshal json:", err, " ", newCfg)
return
}
receiverList = rList
})
global.Config.Watch(global.NamespaceApplication, "service.owner", func(oldCfg string, newCfg string) {
obj := make(map[string][]string)
if err := json.Unmarshal([]byte(newCfg), &obj); err != nil {
glog.Error("can not unmarshal json:", err, " ", newCfg)
return
}
serviceOwner = obj
})
} }
*/ */
package report_form package report_form
/* import "testing"
func TestRegularReport(t *testing.T) { func TestRegularReport(t *testing.T) {
RegularReport("/var/enoch_health_table") RegularReport("/var/enoch_health_table")
select {} select {}
} }
*/
...@@ -37,17 +37,16 @@ func hrn(n int) string { ...@@ -37,17 +37,16 @@ func hrn(n int) string {
} }
//总表 //总表
func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { func (sm *ServiceMap) ServiceMapReportForm() string {
rtn := new(strings.Builder) rtn := new(strings.Builder)
sm := NewServiceMap(startTime, endTime)
var t *Table = nil var t *Table = nil
//表头 //表头
rtn.WriteString("<div><pre>\n") rtn.WriteString("<div><pre>\n")
rtn.WriteString(" 服务健康状态总表\n") rtn.WriteString(" 服务健康状态总表\n")
rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n", rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n",
startTime.In(cstZone).Format(time.RFC3339), sm.startTime.In(cstZone).Format(time.RFC3339),
endTime.In(cstZone).Format(time.RFC3339)), sm.endTime.In(cstZone).Format(time.RFC3339)),
) )
rtn.WriteString(fmt.Sprintf("总访问量:%s 总响应时间:%s 平均响应时间:%s QPS:%.2f\n", rtn.WriteString(fmt.Sprintf("总访问量:%s 总响应时间:%s 平均响应时间:%s QPS:%.2f\n",
hrn(sm.GetCount()), hrn(sm.GetCount()),
...@@ -64,8 +63,10 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -64,8 +63,10 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
//服务平均响应时间排行 //服务平均响应时间排行
averageDurationServiceList := sm.GetAverageDurationServiceList()
if len(averageDurationServiceList) != 0 {
t = NewTable("服务平均响应时间排行", "排名", "响应时间", "服务名称", "访问量", "QPS") t = NewTable("服务平均响应时间排行", "排名", "响应时间", "服务名称", "访问量", "QPS")
for i, s := range sm.GetAverageDurationServiceList() { for i, s := range averageDurationServiceList {
color := colorBlack color := colorBlack
if s.GetAverageDuration() > maxDuration { if s.GetAverageDuration() > maxDuration {
color = colorRed color = colorRed
...@@ -79,12 +80,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -79,12 +80,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", s.GetQps()), fmt.Sprintf("%.2f", s.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//服务接口响应时间中位值排行 //服务接口响应时间中位值排行
getMedianDurationPathList := sm.GetMedianDurationPathList()
if len(getMedianDurationPathList) != 0 {
t = NewTable("服务接口中位响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS") t = NewTable("服务接口中位响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS")
for i, p := range sm.GetMedianDurationPathList() { for i, p := range getMedianDurationPathList {
color := colorBlack color := colorBlack
if p.GetMedianDuration() > maxDuration { if p.GetMedianDuration() > maxDuration {
color = colorRed color = colorRed
...@@ -99,12 +105,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -99,12 +105,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", p.GetQps()), fmt.Sprintf("%.2f", p.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//服务接口响应时间平均值排行 //服务接口响应时间平均值排行
getAverageDurationPathList := sm.GetAverageDurationPathList()
if len(getAverageDurationPathList) != 0 {
t = NewTable("服务接口平均响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS") t = NewTable("服务接口平均响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS")
for i, p := range sm.GetAverageDurationPathList() { for i, p := range getAverageDurationPathList {
color := colorBlack color := colorBlack
if p.GetAverageDuration() > maxDuration { if p.GetAverageDuration() > maxDuration {
color = colorRed color = colorRed
...@@ -119,12 +130,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -119,12 +130,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", p.GetQps()), fmt.Sprintf("%.2f", p.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//响应时间最高的请求排行 //响应时间最高的请求排行
getMaxDurationTracePointList := sm.GetMaxDurationTracePointList()
if len(getMaxDurationTracePointList) != 0 {
t = NewTable("响应时间最高的请求排行", "排名", "响应时间", "服务名称", "接口", "时间戳", "trace_id") t = NewTable("响应时间最高的请求排行", "排名", "响应时间", "服务名称", "接口", "时间戳", "trace_id")
for i, tp := range sm.GetMaxDurationTracePointList() { for i, tp := range getMaxDurationTracePointList {
color := colorBlack color := colorBlack
if tp.Duration > maxDuration { if tp.Duration > maxDuration {
color = colorRed color = colorRed
...@@ -139,12 +155,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -139,12 +155,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
tp.TraceId, tp.TraceId,
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//常规cpu使用率排行 //常规cpu使用率排行
getRemoveN100MaxCpuServiceList := sm.GetRemoveN100MaxCpuServiceList()
if len(getRemoveN100MaxCpuServiceList) != 0 {
t = NewTable("常规cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS") t = NewTable("常规cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetRemoveN100MaxCpuServiceList() { for i, s := range getRemoveN100MaxCpuServiceList {
if s.GetRemoveN100MaxCpu() < cpuMin { if s.GetRemoveN100MaxCpu() < cpuMin {
break break
} }
...@@ -162,12 +183,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -162,12 +183,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", s.GetQps()), fmt.Sprintf("%.2f", s.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//峰值cpu使用率排行 //峰值cpu使用率排行
getMaxCpuServiceList := sm.GetMaxCpuServiceList()
if len(getMaxCpuServiceList) != 0 {
t = NewTable("峰值cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS") t = NewTable("峰值cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetMaxCpuServiceList() { for i, s := range getMaxCpuServiceList {
if s.GetMaxCpu() < cpuMin { if s.GetMaxCpu() < cpuMin {
break break
} }
...@@ -185,12 +211,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -185,12 +211,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", s.GetQps()), fmt.Sprintf("%.2f", s.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//平均内存使用率排行 //平均内存使用率排行
getAverageMemServiceList := sm.GetAverageMemServiceList()
if len(getAverageMemServiceList) != 0 {
t = NewTable("平均内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS") t = NewTable("平均内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetAverageMemServiceList() { for i, s := range getAverageMemServiceList {
if s.GetAverageMem() < memMin { if s.GetAverageMem() < memMin {
break break
} }
...@@ -208,12 +239,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -208,12 +239,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", s.GetQps()), fmt.Sprintf("%.2f", s.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//峰值内存使用率排行 //峰值内存使用率排行
getMaxMemServiceList := sm.GetMaxMemServiceList()
if len(getMaxMemServiceList) != 0 {
t = NewTable("峰值内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS") t = NewTable("峰值内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetMaxMemServiceList() { for i, s := range getMaxMemServiceList {
if s.GetMaxMem() < memMin { if s.GetMaxMem() < memMin {
break break
} }
...@@ -231,12 +267,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -231,12 +267,17 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
fmt.Sprintf("%.2f", s.GetQps()), fmt.Sprintf("%.2f", s.GetQps()),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
//峰值磁盘使用率排行 //峰值磁盘使用率排行
getMaxDiskServiceList := sm.GetMaxDiskServiceList()
if len(getMaxDiskServiceList) != 0 {
t = NewTable("峰值硬盘使用率排行", "排名", "硬盘使用率", "服务名称") t = NewTable("峰值硬盘使用率排行", "排名", "硬盘使用率", "服务名称")
for i, s := range sm.GetMaxDiskServiceList() { for i, s := range getMaxDiskServiceList {
if s.GetMaxDisk() < diskMin { if s.GetMaxDisk() < diskMin {
break break
} }
...@@ -252,8 +293,11 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string { ...@@ -252,8 +293,11 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
s.Name(), s.Name(),
) )
} }
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml()) rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n") rtn.WriteString("\n\n")
}
}
rtn.WriteString("</pre></div>\n") rtn.WriteString("</pre></div>\n")
...@@ -279,6 +323,10 @@ func NewTable(name string, keys ...string) *Table { ...@@ -279,6 +323,10 @@ func NewTable(name string, keys ...string) *Table {
} }
} }
func (t *Table) IsEmpty() bool {
return len(t.recordList) == 0
}
func (t *Table) AddRecord(color string, values ...string) error { func (t *Table) AddRecord(color string, values ...string) error {
if len(values) != len(t.keyList) { if len(values) != len(t.keyList) {
return errors.New("len(values) != len(keyList)") return errors.New("len(values) != len(keyList)")
...@@ -366,20 +414,4 @@ func SubTableRun(s *Service) string { ...@@ -366,20 +414,4 @@ func SubTableRun(s *Service) string {
return rtn.String() return rtn.String()
} }
func GeneralTableNewSM(n int) *ServiceMap {
//求前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, -n)
endTime := startTime.AddDate(0, 0, n)
//查询
sm := NewServiceMap(startTime, endTime)
return sm
}
*/ */
...@@ -7,7 +7,8 @@ import ( ...@@ -7,7 +7,8 @@ import (
) )
func TestRun(t *testing.T) { func TestRun(t *testing.T) {
smForm := ServiceMapReportForm(time.Now().AddDate(0, 0, -10), time.Now()) sm := NewServiceMap(time.Now().AddDate(0, 0, -10), time.Now())
smForm := sm.ServiceMapReportForm()
fmt.Println(smForm) fmt.Println(smForm)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment