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 }