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

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

parent 463e2b06
package report_form
/*
var (
receiverList = make([]string, 0)
serviceOwner = make(map[string][]string)
import (
"git.quantgroup.cn/DevOps/enoch/pkg/glog"
"github.com/vrg0/go-common/util"
"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) {
if !util.IsDir(dir) {
return
......@@ -37,6 +20,7 @@ func RegularReport(dir string) {
if err := recover(); err != nil {
glog.Error(err, "\n", string(debug.Stack()))
}
}()
timer := time.NewTimer(0)
......@@ -44,7 +28,6 @@ func RegularReport(dir string) {
<-timer.C
now := time.Now()
//报表
run(now, dir)
next := now.Add(time.Hour * 24)
......@@ -56,7 +39,59 @@ func RegularReport(dir string) {
func run(now time.Time, dir string) {
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 {
sm := GeneralTableNewSM(7)
......@@ -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
/*
import "testing"
func TestRegularReport(t *testing.T) {
RegularReport("/var/enoch_health_table")
select {}
}
*/
......@@ -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)
sm := NewServiceMap(startTime, endTime)
var t *Table = nil
//表头
rtn.WriteString("<div><pre>\n")
rtn.WriteString(" 服务健康状态总表\n")
rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n",
startTime.In(cstZone).Format(time.RFC3339),
endTime.In(cstZone).Format(time.RFC3339)),
sm.startTime.In(cstZone).Format(time.RFC3339),
sm.endTime.In(cstZone).Format(time.RFC3339)),
)
rtn.WriteString(fmt.Sprintf("总访问量:%s 总响应时间:%s 平均响应时间:%s QPS:%.2f\n",
hrn(sm.GetCount()),
......@@ -64,196 +63,241 @@ func ServiceMapReportForm(startTime time.Time, endTime time.Time) string {
rtn.WriteString("\n\n")
//服务平均响应时间排行
t = NewTable("服务平均响应时间排行", "排名", "响应时间", "服务名称", "访问量", "QPS")
for i, s := range sm.GetAverageDurationServiceList() {
color := colorBlack
if s.GetAverageDuration() > maxDuration {
color = colorRed
averageDurationServiceList := sm.GetAverageDurationServiceList()
if len(averageDurationServiceList) != 0 {
t = NewTable("服务平均响应时间排行", "排名", "响应时间", "服务名称", "访问量", "QPS")
for i, s := range averageDurationServiceList {
color := colorBlack
if s.GetAverageDuration() > maxDuration {
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6), //精度毫秒
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6), //精度毫秒
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//服务接口响应时间中位值排行
t = NewTable("服务接口中位响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS")
for i, p := range sm.GetMedianDurationPathList() {
color := colorBlack
if p.GetMedianDuration() > maxDuration {
color = colorRed
getMedianDurationPathList := sm.GetMedianDurationPathList()
if len(getMedianDurationPathList) != 0 {
t = NewTable("服务接口中位响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS")
for i, p := range getMedianDurationPathList {
color := colorBlack
if p.GetMedianDuration() > maxDuration {
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", p.GetMedianDuration()/1e6*1e6), //精度保留毫秒
p.GetServiceName(),
p.GetPath(),
hrn(p.GetCount()),
fmt.Sprintf("%.2f", p.GetQps()),
)
}
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", p.GetMedianDuration()/1e6*1e6), //精度保留毫秒
p.GetServiceName(),
p.GetPath(),
hrn(p.GetCount()),
fmt.Sprintf("%.2f", p.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//服务接口响应时间平均值排行
t = NewTable("服务接口平均响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS")
for i, p := range sm.GetAverageDurationPathList() {
color := colorBlack
if p.GetAverageDuration() > maxDuration {
color = colorRed
getAverageDurationPathList := sm.GetAverageDurationPathList()
if len(getAverageDurationPathList) != 0 {
t = NewTable("服务接口平均响应时间排行", "排名", "响应时间", "服务名称", "接口", "访问量", "QPS")
for i, p := range getAverageDurationPathList {
color := colorBlack
if p.GetAverageDuration() > maxDuration {
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", p.GetAverageDuration()/1e6*1e6), //精度保留毫秒
p.GetServiceName(),
p.GetPath(),
hrn(p.GetCount()),
fmt.Sprintf("%.2f", p.GetQps()),
)
}
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", p.GetAverageDuration()/1e6*1e6), //精度保留毫秒
p.GetServiceName(),
p.GetPath(),
hrn(p.GetCount()),
fmt.Sprintf("%.2f", p.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//响应时间最高的请求排行
t = NewTable("响应时间最高的请求排行", "排名", "响应时间", "服务名称", "接口", "时间戳", "trace_id")
for i, tp := range sm.GetMaxDurationTracePointList() {
color := colorBlack
if tp.Duration > maxDuration {
color = colorRed
getMaxDurationTracePointList := sm.GetMaxDurationTracePointList()
if len(getMaxDurationTracePointList) != 0 {
t = NewTable("响应时间最高的请求排行", "排名", "响应时间", "服务名称", "接口", "时间戳", "trace_id")
for i, tp := range getMaxDurationTracePointList {
color := colorBlack
if tp.Duration > maxDuration {
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", tp.Duration/1e6*1e6), //精度保留毫秒
tp.ServiceName,
tp.Path,
tp.Timestamp.In(cstZone).Format(timeFormat),
tp.TraceId,
)
}
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%v", tp.Duration/1e6*1e6), //精度保留毫秒
tp.ServiceName,
tp.Path,
tp.Timestamp.In(cstZone).Format(timeFormat),
tp.TraceId,
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//常规cpu使用率排行
t = NewTable("常规cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetRemoveN100MaxCpuServiceList() {
if s.GetRemoveN100MaxCpu() < cpuMin {
break
getRemoveN100MaxCpuServiceList := sm.GetRemoveN100MaxCpuServiceList()
if len(getRemoveN100MaxCpuServiceList) != 0 {
t = NewTable("常规cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range getRemoveN100MaxCpuServiceList {
if s.GetRemoveN100MaxCpu() < cpuMin {
break
}
color := colorBlack
if s.GetRemoveN100MaxCpu() > 50 { //超过一半标红
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetRemoveN100MaxCpu()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
color := colorBlack
if s.GetRemoveN100MaxCpu() > 50 { //超过一半标红
color = colorRed
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetRemoveN100MaxCpu()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//峰值cpu使用率排行
t = NewTable("峰值cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetMaxCpuServiceList() {
if s.GetMaxCpu() < cpuMin {
break
getMaxCpuServiceList := sm.GetMaxCpuServiceList()
if len(getMaxCpuServiceList) != 0 {
t = NewTable("峰值cpu使用率排行", "排名", "cpu使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range getMaxCpuServiceList {
if s.GetMaxCpu() < cpuMin {
break
}
color := colorBlack
if s.GetMaxCpu() > 80 { //超过80标红
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetMaxCpu()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
color := colorBlack
if s.GetMaxCpu() > 80 { //超过80标红
color = colorRed
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetMaxCpu()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//平均内存使用率排行
t = NewTable("平均内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetAverageMemServiceList() {
if s.GetAverageMem() < memMin {
break
getAverageMemServiceList := sm.GetAverageMemServiceList()
if len(getAverageMemServiceList) != 0 {
t = NewTable("平均内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range getAverageMemServiceList {
if s.GetAverageMem() < memMin {
break
}
color := colorBlack
if s.GetAverageMem() > 50 { //超过50标红
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetAverageMem()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
color := colorBlack
if s.GetAverageMem() > 50 { //超过50标红
color = colorRed
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetAverageMem()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//峰值内存使用率排行
t = NewTable("峰值内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range sm.GetMaxMemServiceList() {
if s.GetMaxMem() < memMin {
break
getMaxMemServiceList := sm.GetMaxMemServiceList()
if len(getMaxMemServiceList) != 0 {
t = NewTable("峰值内存使用率排行", "排名", "内存使用率", "服务名称", "访问量", "平均响应时间", "QPS")
for i, s := range getMaxMemServiceList {
if s.GetMaxMem() < memMin {
break
}
color := colorBlack
if s.GetMaxMem() > 80 { //超过80标红
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetMaxMem()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
color := colorBlack
if s.GetMaxMem() > 80 { //超过80标红
color = colorRed
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetMaxMem()),
s.Name(),
hrn(s.GetCount()),
fmt.Sprintf("%v", s.GetAverageDuration()/1e6*1e6),
fmt.Sprintf("%.2f", s.GetQps()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
//峰值磁盘使用率排行
t = NewTable("峰值硬盘使用率排行", "排名", "硬盘使用率", "服务名称")
for i, s := range sm.GetMaxDiskServiceList() {
if s.GetMaxDisk() < diskMin {
break
getMaxDiskServiceList := sm.GetMaxDiskServiceList()
if len(getMaxDiskServiceList) != 0 {
t = NewTable("峰值硬盘使用率排行", "排名", "硬盘使用率", "服务名称")
for i, s := range getMaxDiskServiceList {
if s.GetMaxDisk() < diskMin {
break
}
color := colorBlack
if s.GetMaxDisk() > 80 {
color = colorRed
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetMaxDisk()),
s.Name(),
)
}
color := colorBlack
if s.GetMaxDisk() > 80 {
color = colorRed
if !t.IsEmpty() {
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
_ = t.AddRecord(
color,
fmt.Sprintf("No.%d", i+1),
fmt.Sprintf("%d%%", s.GetMaxDisk()),
s.Name(),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
rtn.WriteString("</pre></div>\n")
......@@ -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 {
if len(values) != len(t.keyList) {
return errors.New("len(values) != len(keyList)")
......@@ -366,20 +414,4 @@ func SubTableRun(s *Service) 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 (
)
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)
}
......
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