Commit d4d8e8ed authored by jingbo.wang's avatar jingbo.wang

总表 ok

parent 1e31f279
package report_form package report_form
import ( import (
"errors"
"fmt" "fmt"
"git.quantgroup.cn/DevOps/enoch/pkg/glog" "strings"
"time" "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() now := time.Now()
startTime := now.Add(-1 * time.Duration(now.Hour()) * time.Hour) 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.Minute()) * time.Minute)
startTime = startTime.Add(-1 * time.Duration(now.Second()) * time.Second) startTime = startTime.Add(-1 * time.Duration(now.Second()) * time.Second)
startTime = startTime.Add(-1 * time.Duration(now.Nanosecond())) startTime = startTime.Add(-1 * time.Duration(now.Nanosecond()))
startTime = startTime.AddDate(0, 0, -7) startTime = startTime.AddDate(0, 0, -n)
endTime := startTime.AddDate(0, 0, 7) endTime := startTime.AddDate(0, 0, n)
glog.Info("startTime:", startTime.UnixNano(), " endTime:", endTime.UnixNano())
//查询
sm := NewServiceMap(startTime, endTime) sm := NewServiceMap(startTime, endTime)
fmt.Println(sm.GetCount())
/* //生成报表
rtn := new(strings.Builder)
t.Log("访问量:", sm.GetCount())
t.Log("总访问时间:", sm.GetSumDuration()) //表头
t.Log("总平均访问时间:", sm.GetAverageDuration()) rtn.WriteString(" 服务健康状态总表\n")
t.Log("------------------median-------------------")
medianList := sm.GetMedianDurationPathList() //时间
t.Log("服务数量:", len(medianList)) rtn.WriteString(fmt.Sprintf("时间:%s ~ %s\n", startTime.Format(time.RFC3339), endTime.Format(time.RFC3339)))
for _, m := range medianList {
t.Log(m.GetMedianDuration(), m.GetServiceName(), m.GetPath(), m.GetCount()) //访问量
} rtn.WriteString(fmt.Sprintf("总访问量:%v 总响应时间:%v 平均响应时间:%v\n\n",
t.Log("------------------average------------------") sm.GetCount(), sm.GetSumDuration(), sm.GetAverageDuration()))
averageList := sm.GetAverageDurationPathList()
t.Log("服务数量:", len(averageList)) //服务响应时间中位值排行
for _, m := range averageList { medianTable := NewTable("服务响应时间中位值排行", "duration", "sys_name", "path", "count")
t.Log(m.GetAverageDuration(), m.GetServiceName(), m.GetPath(), m.GetCount()) medianList := sm.GetMedianDurationPathList()
} for _, m := range medianList {
t.Log("------------------max----------------------") _ = medianTable.AddRecord(m.GetMedianDuration(), m.GetServiceName(), m.GetPath(), m.GetCount())
maxList := sm.GetMaxDurationTracePointList() }
t.Log("服务数量:", len(maxList)) rtn.WriteString(medianTable.ToString())
for _, m := range maxList { rtn.WriteString("\n")
t.Log(m.Duration, m.ServiceName, m.Path, m.Timestamp, m.TraceId)
} //服务响应时间平均值排行
*/ 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()
} }
package report_form package report_form
import "testing" import (
"fmt"
"testing"
"unicode/utf8"
)
func TestRun(t *testing.T) { 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
}
} }
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