Commit 26dc0524 authored by jingbo.wang's avatar jingbo.wang

单个服务报表完成

parent 1c7a3933
......@@ -76,10 +76,23 @@ func reportForm(t time.Time, dir string, n int) {
startTime = startTime.AddDate(0, 0, -n)
endTime := startTime.AddDate(0, 0, n)
glog.Info("报表开始:", startTime.Format(timeFormat), " ~ ", endTime.Format(timeFormat))
sm := NewServiceMap(startTime, endTime)
all := sm.ServiceMapReportForm()
//总表
all := sm.ReportForm()
if err := ioutil.WriteFile(dir+"/all.html", []byte(all), os.ModePerm); err != nil {
glog.Error("写入文件失败", dir+"/all.html", " ", err)
glog.Error("写入文件失败", dir, " all.html ", err)
return
}
//分表
for name, s := range sm.GetServiceMap() {
data := s.ReportForm()
if err := ioutil.WriteFile(dir+"/"+name+".html", []byte(data), os.ModePerm); err != nil {
glog.Error("写入文件失败", dir, " ", name, ".html ", err)
return
}
}
glog.Info("报表结束")
}
......@@ -61,13 +61,159 @@ func (sm *ServiceMap) GetPathCount(serviceName string, path string) int {
return p.GetCount()
}
//
func (sm *ServiceMap) ServiceMapReportForm() string {
//
func (s *Service) ReportForm() string {
rtn := new(strings.Builder)
var t *Table = nil
rtn.WriteString("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body><div><pre>\n")
//表头
rtn.WriteString(" 服务健康状态表:" + s.Name() + "\n")
rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n",
s.startTime.In(cstZone).Format(timeFormat),
s.endTime.In(cstZone).Format(timeFormat)),
)
rtn.WriteString(fmt.Sprintf("总访问量:%s 总响应时间:%s 平均响应时间:%s QPS:%.2f\n",
hrn(s.GetCount()),
s.GetSumDuration()/1e6*1e6, //精度保留到毫秒
s.GetAverageDuration()/1e6*1e6, //精度保留到毫秒
s.GetQps()),
)
rtn.WriteString(fmt.Sprintf("常规CPU使用率:%d%% 峰值CPU使用率:%d%% 平均内存使用率:%d%% 峰值内存使用率:%d%% 峰值硬盘使用率:%d%%\n",
s.GetRemoveN100MaxCpu(),
s.GetMaxCpu(),
s.GetAverageMem(),
s.GetMaxMem(),
s.GetMaxDisk(),
))
rtn.WriteString("\n\n")
rtn.WriteString("阅读说明:\n")
rtn.WriteString("1、易读数字:单位K、M、G、T、P、E,进制1024\n")
rtn.WriteString("2、排名:排名越高健康状态越差,如果排名标红,则表示存在风险\n")
rtn.WriteString("3、表头部分的CPU、内存、硬盘使用率:取的是服务节点中各项使用率的的最高值\n")
rtn.WriteString("4、常规cpu使用率:去针尖后的最高CPU使用率,针尖指的是CPU使用率暴增的场景\n")
rtn.WriteString("\n\n")
//服务接口中位响应时间TOP10
getMedianDurationPathList := s.GetMedianDurationPathList()
if len(getMedianDurationPathList) != 0 {
t = NewTable("服务接口中位响应时间TOP10", "排名", "响应时间", "接口", "访问量", "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.GetPath(),
hrn(p.GetCount()),
fmt.Sprintf("%.2f", p.GetQps()),
)
//取前10
if i+1 == 10 {
break
}
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
//服务接口平均响应时间TOP10
getAverageDurationPathList := s.GetAverageDurationPathList()
if len(getAverageDurationPathList) != 0 {
t = NewTable("服务接口平均响应时间TOP10", "排名", "响应时间", "接口", "访问量", "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.GetPath(),
hrn(p.GetCount()),
fmt.Sprintf("%.2f", p.GetQps()),
)
//取前10
if i+1 == 10 {
break
}
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
//服务接口峰值响应时间TOP10
getMaxDurationPathList := s.GetMaxDurationPathList()
if len(getMaxDurationPathList) != 0 {
t = NewTable("服务接口峰值响应时间TOP10", "排名", "响应时间", "接口", "时间戳", "trace_id", "访问量")
for i, p := range getMaxDurationPathList {
tp := p.GetMaxDurationTracePoint()
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.Path,
tp.Timestamp.In(cstZone).Format(timeFormat),
fmt.Sprintf(`<a href="http://zipkin-3c.xyqb.com/zipkin/traces/%s" target="_blank" rel="noopener noreferrer">%s</a>`, tp.TraceId, tp.TraceId),
hrn(p.GetCount()),
)
//取前10
if i+1 == 10 {
break
}
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
//节点状态
nodeList := s.GetNodeList()
if len(nodeList) != 0 {
t = NewTable("节点状态", "IP", "常规CPU使用率", "峰值CPU使用率", "平均内存使用率", "峰值内存使用率", "峰值硬盘使用率", "最大线程数", "平均线程数")
for _, n := range nodeList {
color := colorBlack
if n.GetRemoveN100MaxCpu() > 50 || n.GetMaxCpu() > 80 || n.GetAverageMem() > 50 ||
n.GetMaxMem() > 80 || n.GetMaxDisk() > 80 {
color = colorRed
}
_ = t.AddRecord(
color,
n.GetAddress(),
fmt.Sprintf("%d%%", n.GetRemoveN100MaxCpu()),
fmt.Sprintf("%d%%", n.GetMaxCpu()),
fmt.Sprintf("%d%%", n.GetAverageMem()),
fmt.Sprintf("%d%%", n.GetMaxMem()),
fmt.Sprintf("%d%%", n.GetMaxDisk()),
hrn(n.GetMaxThread()),
hrn(n.GetAverageThread()),
)
}
rtn.WriteString(t.ToHtml())
rtn.WriteString("\n\n")
}
rtn.WriteString("</pre></div></body></html>\n")
return rtn.String()
}
//总表
func (sm *ServiceMap) ReportForm() string {
rtn := new(strings.Builder)
var t *Table = nil
rtn.WriteString("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body><div><pre>\n")
//表头
rtn.WriteString(" 服务健康状态总表\n")
rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n",
sm.startTime.In(cstZone).Format(timeFormat),
......@@ -83,7 +229,7 @@ func (sm *ServiceMap) ServiceMapReportForm() string {
rtn.WriteString("阅读说明:\n")
rtn.WriteString("1、易读数字:单位K、M、G、T、P、E,进制1024\n")
rtn.WriteString("2、排名:排名越高健康状态越差,如果排名标红,则表示存在风险\n")
rtn.WriteString("3、CPU、内存、磁盘:服务有多个节点,总表中CPU、内存、磁盘取的是服务节点中的最高值\n")
rtn.WriteString("3、CPU、内存、磁盘使用率:取的是服务节点中各项使用率的的最高值\n")
rtn.WriteString("4、常规cpu使用率:去针尖后的最高CPU使用率,针尖指的是CPU使用率暴增的场景\n")
rtn.WriteString("\n\n")
......@@ -385,38 +531,9 @@ func (t *Table) ToHtml() string {
}
/*
//添加记录
t.recordList = append(t.recordList, valueList)
return nil
}
//body := ServiceTableRun(service)
func SubTableRun(s *Service) string {
rtn := new(strings.Builder)
//标题
rtn.WriteString(" 服务健康状态表:" + s.Name() + "\n")
//时间
rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n",
s.startTime.Format(time.RFC3339), s.endTime.Format(time.RFC3339)))
//访问量
rtn.WriteString(fmt.Sprintf("总访问量:%v 总响应时间:%v 平均响应时间:%v\n",
s.GetCount(), s.GetSumDuration(), s.GetAverageDuration()))
//基本信息
rtn.WriteString(fmt.Sprintf("常规CPU使用率:%v 峰值CPU使用率:%v 峰值内存使用率:%v 峰值硬盘使用率:%v\n\n",
s.GetRemoveN100MaxCpu(), s.GetMaxCpu(), s.GetMaxMem(), s.GetMaxDisk()))
//接口中位响应时间排行
medianDurationTable := NewTable("接口中位响应时间排行", "duration", "path", "traffic_volume")
plist := s.GetMedianDurationPathList()
for _, p := range plist {
_ = medianDurationTable.AddRecord(p.GetMedianDuration(), p.GetPath(), p.GetCount())
}
rtn.WriteString(medianDurationTable.ToString())
rtn.WriteString("\n")
//接口平均响应时间排行
averageDurationTable := NewTable("接口平均响应时间排行", "duration", "path", "traffic_volume")
......
......@@ -8,8 +8,10 @@ import (
func TestRun(t *testing.T) {
sm := NewServiceMap(time.Now().AddDate(0, 0, -10), time.Now())
smForm := sm.ServiceMapReportForm()
smForm := sm.ReportForm()
fmt.Println(smForm)
fmt.Println(sm.GetServiceMap()["xyqb-user2"].ReportForm())
}
/*
......
......@@ -101,6 +101,17 @@ func (s *Service) GetPathMap() map[string]*Path {
return s.pathMap
}
//获取节点
func (s *Service) GetNodeList() []*Node {
rtn := make([]*Node, 0)
for _, n := range s.nodeMap {
rtn = append(rtn, n)
}
return rtn
}
//获取节点列表
func (s *Service) getNodeList() []string {
const sqlGetNodeList = `SHOW TAG VALUES FROM machine_info WITH key = "host" WHERE sys_name = '%s';`
......
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