93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
package statlandpage
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"stat/common/log"
|
|
"stat/common/statutils"
|
|
"stat/common/utils"
|
|
statrecordmod "stat/models/statrecord"
|
|
"time"
|
|
)
|
|
|
|
type StatMethod func(ctx context.Context, start, end time.Time) error
|
|
type TimeAlignFunc func(t time.Time) time.Time
|
|
|
|
func timeAlignForDaily(t time.Time) time.Time {
|
|
return utils.BeginWithTime(t)
|
|
}
|
|
func timeAlignForHour(t time.Time) time.Time {
|
|
return utils.RecentMinute(t, 60)
|
|
}
|
|
|
|
func RunStatHour(defaultStatDate time.Time) error {
|
|
ctx := context.Background()
|
|
job := statrecordmod.LandPageHourStatJob
|
|
recordMap := defaultTimeMap(defaultStatDate)
|
|
return recordStat(ctx, recordMap, job, time.Hour, -time.Hour, statLandPageHourApps, timeAlignForHour)
|
|
}
|
|
|
|
func RunStatDaily(defaultStatDate time.Time) error {
|
|
ctx := context.Background()
|
|
job := statrecordmod.LandPageDailyStatJob
|
|
recordMap := defaultTimeMap(defaultStatDate)
|
|
return recordStat(ctx, recordMap, job, 24*time.Hour, -time.Hour, statLandPageDailyApps, timeAlignForDaily)
|
|
}
|
|
|
|
// recordStat 统计
|
|
func recordStat(ctx context.Context, recordMap map[string]time.Time, job string, timeStep, timeBack time.Duration, stat StatMethod, align TimeAlignFunc) error {
|
|
recordResult, err := statrecordmod.LastRecordTimeMap(ctx, job) //第一次从默认记录时间开始统计
|
|
if err != nil {
|
|
log.Error("LastRecordTimeMap", log.E(err))
|
|
return err
|
|
}
|
|
for _, record := range recordResult {
|
|
recordMap[record.Item] = record.RecordTime
|
|
}
|
|
|
|
now := time.Now().Add(timeBack)
|
|
curStatTime := align(now)
|
|
|
|
for item, lastStatAt := range recordMap {
|
|
_lastStatAt := align(lastStatAt)
|
|
|
|
for curStatTime.After(_lastStatAt) {
|
|
end := _lastStatAt.Add(timeStep)
|
|
|
|
fmt.Printf("item:%s, start:%s, end:%s\n", item, _lastStatAt, end)
|
|
|
|
err := runStatMethod(ctx, item, job, _lastStatAt, end, stat)
|
|
if err != nil {
|
|
log.Error("recordStat failed!", log.E(err), log.Any("item", item), log.Any("job", job))
|
|
return err
|
|
}
|
|
|
|
_lastStatAt = end
|
|
}
|
|
|
|
recordMap[item] = _lastStatAt
|
|
}
|
|
return err
|
|
}
|
|
|
|
// runStatMethod 调用统计项方法
|
|
func runStatMethod(ctx context.Context, item, job string, start, end time.Time, stat StatMethod) error {
|
|
var err error
|
|
// 调用统计方法,获取数据
|
|
err = statutils.ServerMon.RunWithName(func() error {
|
|
return stat(ctx, start, end)
|
|
}, statutils.GetFuncName(stat))
|
|
|
|
if err != nil {
|
|
log.Error("runStatMethod failed!", log.Any("statItem", item), log.E(err))
|
|
return err
|
|
}
|
|
|
|
if err := statrecordmod.UpsertItemRecord(ctx, job, item, end); err != nil {
|
|
log.Error("commit UpsertItemRecord failed!", log.E(err))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|