Files
stat_center/skd/skd.go
T
2026-11-05 12:11:56 +08:00

134 lines
3.6 KiB
Go

package skd
import (
"context"
"math/rand"
"stat/common/enum/consts"
"stat/common/log"
"stat/common/statutils"
"stat/skd/job/advertisejob"
applicationjob "stat/skd/job/application"
"stat/skd/job/limitstat"
"stat/skd/job/statdaily"
"stat/skd/job/statdailyhour"
"stat/skd/job/statdistrict"
"stat/skd/job/stathour"
"stat/skd/job/statlandpage"
"stat/skd/job/statminute"
"stat/statg"
"time"
"github.com/robfig/cron/v3"
)
var (
skdCron *cron.Cron
)
func init() {
skdCron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务
}
// Start 定时器任务启动
func Start() {
log.Info("skd start...")
rand.Seed(time.Now().UnixNano())
if statg.Conf.RunMod != consts.RunModRelease {
return
}
// 获取默认统计开始日期
defaultStatDate, err := getDefaultStatDate()
if err != nil {
log.Error("defaultStatDate invalid", log.E(err))
return
}
if statg.Conf.RunMod == consts.RunModRelease {
// IP限制统计
_, _ = skdCron.AddFunc("0 5 */1 * * ?", func() {
statutils.ServerMon.Run(limitstat.IpAddressLimitStat)
})
// 广告点击统计
_, _ = skdCron.AddFunc("0 5 */1 * * ?", func() {
statutils.ServerMon.Run(advertisejob.StatAdvertiseHourStat)
})
// 落地页小时统计
_, _ = skdCron.AddFunc("0 28 */1 * * ?", func() {
defaultTime, _ := time.Parse(time.RFC3339, "2023-08-01T00:00:00+08:00")
statutils.ServerMon.Run1(statlandpage.RunStatHour, defaultTime)
})
// 落地页每日统计
_, _ = skdCron.AddFunc("0 40 0 * * ?", func() {
defaultTime, _ := time.Parse(time.RFC3339, "2023-08-01T00:00:00+08:00")
statutils.ServerMon.Run1(statlandpage.RunStatDaily, defaultTime)
})
// 日活统计,统计上一天日活,校正
_, _ = skdCron.AddFunc("0 35 0 * * ?", func() {
statutils.ServerMon.Run1(statdaily.RunStat, defaultStatDate)
})
_, _ = skdCron.AddFunc("0 35 2 * * ?", func() {
statutils.ServerMon.Run1(statdistrict.RunStat, defaultStatDate)
})
// 日常统计数据、每小时数据
_, _ = skdCron.AddFunc("0 0/5 * * * ?", func() {
statutils.ServerMon.Run(statdaily.RunStatToday)
statutils.ServerMon.Run1(statdailyhour.RunStat, defaultStatDate)
})
// 统计首页曲线图
_, _ = skdCron.AddFunc("0 0/5 * * * ?", func() {
statutils.ServerMon.Run1(stathour.RunStat, defaultStatDate)
})
// 渠道结算
_, _ = skdCron.AddFunc("0 0/5 * * * ?", func() {
statutils.ServerMon.Run1(statminute.RunStat, defaultStatDate)
})
// 渠道同时段对比数据(channel_stat_yestoday)
// 必须严格整点一次: 记录按 sumDate=当前整点 作为唯一键的一部分,
// 跑在 5 分钟粒度上会在同一小时内反复覆盖同一批记录,没有意义且白耗资源。
_, _ = skdCron.AddFunc("0 0 */1 * * ?", func() {
statutils.ServerMon.Run(statminute.ChannelSettlementUpdateByHour)
})
}
// 应用点击统计
id, err := skdCron.AddFunc("0 5 */1 * * ?", func() {
statutils.ServerMon.Run(applicationjob.StatAppHourClick)
})
// 广告配置
skdCron.AddFunc("0 0/5 * * * ?", func() {
statutils.ServerMon.Run(advertisejob.LoadTgbotsend)
})
if err != nil {
log.Error("defaultStatDate invalid", log.E(err), log.Any("id", id))
return
}
skdCron.Start()
}
// Stop 定时器任务停止
func Stop() {
ctx := skdCron.Stop()
<-ctx.Done()
err := ctx.Err()
if err != nil && err != context.Canceled {
log.Error("skd job stop error", log.E(err))
return
}
log.Info("skd jobs end!", log.Any("end at", time.Now()))
}
func getDefaultStatDate() (time.Time, error) {
return time.ParseInLocation("2006-01-02", "2026-05-01", time.Local)
}