Files
EdgeAPI/internal/rpc/services/service_traffic_daily_stat.go
GoEdgeLab 5a17ae9d79 v1.4.1
2024-07-27 14:15:25 +08:00

99 lines
3.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2022 GoEdge CDN goedge.cdn@gmail.com. All rights reserved.
package services
import (
"context"
"fmt"
"regexp"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/types"
)
// TrafficDailyStatService 按日统计服务
type TrafficDailyStatService struct {
BaseService
}
// FindTrafficDailyStatWithDay 查找某日统计
func (this *TrafficDailyStatService) FindTrafficDailyStatWithDay(ctx context.Context, req *pb.FindTrafficDailyStatWithDayRequest) (*pb.FindTrafficDailyStatWithDayResponse, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
var day = req.Day
var stat = &stats.TrafficDailyStat{
Day: day,
}
if len(req.Minute) > 0 && regexp.MustCompile(`^\d{6}$`).MatchString(req.Minute) {
var hourString = req.Minute[:2]
var hourInt = types.Int(hourString)
var lastHourInt = hourInt - 1
// 过往小时
if lastHourInt >= 0 {
var hourFrom = day + "00"
var hourTo = day + fmt.Sprintf("%02d", lastHourInt)
sumStat, err := stats.SharedTrafficHourlyStatDAO.SumHourlyStats(tx, hourFrom, hourTo)
if err != nil {
return nil, err
}
if sumStat != nil {
stat = &stats.TrafficDailyStat{
Id: 0,
Day: day,
CachedBytes: sumStat.CachedBytes,
Bytes: sumStat.Bytes,
CountRequests: sumStat.CountRequests,
CountCachedRequests: sumStat.CountCachedRequests,
CountAttackRequests: sumStat.CountAttackRequests,
AttackBytes: sumStat.AttackBytes,
}
}
}
// 当前小时
hourStat, err := stats.SharedTrafficHourlyStatDAO.FindHourlyStat(tx, day+hourString)
if err != nil {
return nil, err
}
if hourStat != nil {
var minutes = types.Int(req.Minute[2:4])/10 + 1 // 这里使用10分钟所以下面是6而不是秒以便于让数据不至于变化太大毕竟流量不是事实统计的
stat.Bytes += hourStat.Bytes * uint64(minutes) / 6
stat.CachedBytes += hourStat.CachedBytes * uint64(minutes) / 6
stat.CountRequests += hourStat.CountRequests * uint64(minutes) / 6
stat.CountCachedRequests += hourStat.CountCachedRequests * uint64(minutes) / 6
stat.CountAttackRequests += hourStat.CountAttackRequests * uint64(minutes) / 6
stat.AttackBytes += hourStat.AttackBytes * uint64(minutes) / 6
}
} else {
stat, err = stats.SharedTrafficDailyStatDAO.FindDailyStat(tx, day)
if err != nil {
return nil, err
}
}
if stat == nil {
return &pb.FindTrafficDailyStatWithDayResponse{
TrafficDailyStat: nil,
}, nil
}
return &pb.FindTrafficDailyStatWithDayResponse{
TrafficDailyStat: &pb.TrafficDailyStat{
Id: int64(stat.Id),
Day: stat.Day,
CachedBytes: int64(stat.CachedBytes),
Bytes: int64(stat.Bytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
},
}, nil
}