/
service_traffic_daily_stat.go
97 lines (88 loc) · 3.07 KB
/
service_traffic_daily_stat.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package services
import (
"context"
"fmt"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/types"
"regexp"
)
// 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
}