mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-04 07:31:53 +08:00
限制单个服务每次上传的域名统计数不超过20个
This commit is contained in:
@@ -10,22 +10,22 @@ import (
|
||||
|
||||
func TestBandwidthStatManager_Add(t *testing.T) {
|
||||
var manager = stats.NewBandwidthStatManager()
|
||||
manager.Add(1, 1, 10, 10)
|
||||
manager.Add(1, 1, 10, 10)
|
||||
manager.Add(1, 1, 10, 10)
|
||||
manager.AddBandwidth(1, 1, 10, 10)
|
||||
manager.AddBandwidth(1, 1, 10, 10)
|
||||
manager.AddBandwidth(1, 1, 10, 10)
|
||||
time.Sleep(1 * time.Second)
|
||||
manager.Add(1, 1, 85, 85)
|
||||
manager.AddBandwidth(1, 1, 85, 85)
|
||||
time.Sleep(1 * time.Second)
|
||||
manager.Add(1, 1, 25, 25)
|
||||
manager.Add(1, 1, 75, 75)
|
||||
manager.AddBandwidth(1, 1, 25, 25)
|
||||
manager.AddBandwidth(1, 1, 75, 75)
|
||||
manager.Inspect()
|
||||
}
|
||||
|
||||
func TestBandwidthStatManager_Loop(t *testing.T) {
|
||||
var manager = stats.NewBandwidthStatManager()
|
||||
manager.Add(1, 1, 10, 10)
|
||||
manager.Add(1, 1, 10, 10)
|
||||
manager.Add(1, 1, 10, 10)
|
||||
manager.AddBandwidth(1, 1, 10, 10)
|
||||
manager.AddBandwidth(1, 1, 10, 10)
|
||||
manager.AddBandwidth(1, 1, 10, 10)
|
||||
err := manager.Loop()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
@@ -44,8 +45,8 @@ const trafficStatsMaxLife = 1200 // 最大只保存20分钟内的数据
|
||||
|
||||
// TrafficStatManager 区域流量统计
|
||||
type TrafficStatManager struct {
|
||||
itemMap map[string]*TrafficItem // [timestamp serverId] => *TrafficItem
|
||||
domainsMap map[string]*TrafficItem // timestamp @ serverId @ domain => *TrafficItem
|
||||
itemMap map[string]*TrafficItem // [timestamp serverId] => *TrafficItem
|
||||
domainsMap map[int64]map[string]*TrafficItem // serverIde => { timestamp @ domain => *TrafficItem }
|
||||
|
||||
pbItems []*pb.ServerDailyStat
|
||||
pbDomainItems []*pb.UploadServerDailyStatsRequest_DomainStat
|
||||
@@ -59,7 +60,7 @@ type TrafficStatManager struct {
|
||||
func NewTrafficStatManager() *TrafficStatManager {
|
||||
var manager = &TrafficStatManager{
|
||||
itemMap: map[string]*TrafficItem{},
|
||||
domainsMap: map[string]*TrafficItem{},
|
||||
domainsMap: map[int64]map[string]*TrafficItem{},
|
||||
}
|
||||
|
||||
return manager
|
||||
@@ -140,11 +141,17 @@ func (this *TrafficStatManager) Add(serverId int64, domain string, bytes int64,
|
||||
item.PlanId = planId
|
||||
|
||||
// 单个域名流量
|
||||
var domainKey = strconv.FormatInt(timestamp, 10) + "@" + strconv.FormatInt(serverId, 10) + "@" + domain
|
||||
domainItem, ok := this.domainsMap[domainKey]
|
||||
var domainKey = types.String(timestamp) + "@" + domain
|
||||
serverDomainMap, ok := this.domainsMap[serverId]
|
||||
if !ok {
|
||||
serverDomainMap = map[string]*TrafficItem{}
|
||||
this.domainsMap[serverId] = serverDomainMap
|
||||
}
|
||||
|
||||
domainItem, ok := serverDomainMap[domainKey]
|
||||
if !ok {
|
||||
domainItem = &TrafficItem{}
|
||||
this.domainsMap[domainKey] = domainItem
|
||||
serverDomainMap[domainKey] = domainItem
|
||||
}
|
||||
domainItem.Bytes += bytes
|
||||
domainItem.CachedBytes += cachedBytes
|
||||
@@ -176,7 +183,7 @@ func (this *TrafficStatManager) Upload() error {
|
||||
|
||||
// reset
|
||||
this.itemMap = map[string]*TrafficItem{}
|
||||
this.domainsMap = map[string]*TrafficItem{}
|
||||
this.domainsMap = map[int64]map[string]*TrafficItem{}
|
||||
|
||||
this.locker.Unlock()
|
||||
|
||||
@@ -208,23 +215,43 @@ func (this *TrafficStatManager) Upload() error {
|
||||
}
|
||||
|
||||
// 域名统计
|
||||
const maxDomainsPerServer = 20
|
||||
var pbDomainStats = []*pb.UploadServerDailyStatsRequest_DomainStat{}
|
||||
for key, item := range domainMap {
|
||||
var pieces = strings.SplitN(key, "@", 3)
|
||||
if len(pieces) != 3 {
|
||||
continue
|
||||
for serverId, serverDomainMap := range domainMap {
|
||||
// 如果超过单个服务最大值,则只取前N个
|
||||
var shouldTrim = len(serverDomainMap) > maxDomainsPerServer
|
||||
var tempItems []*pb.UploadServerDailyStatsRequest_DomainStat
|
||||
|
||||
for key, item := range serverDomainMap {
|
||||
var pieces = strings.SplitN(key, "@", 2)
|
||||
if len(pieces) != 2 {
|
||||
continue
|
||||
}
|
||||
var pbItem = &pb.UploadServerDailyStatsRequest_DomainStat{
|
||||
ServerId: serverId,
|
||||
Domain: pieces[1],
|
||||
Bytes: item.Bytes,
|
||||
CachedBytes: item.CachedBytes,
|
||||
CountRequests: item.CountRequests,
|
||||
CountCachedRequests: item.CountCachedRequests,
|
||||
CountAttackRequests: item.CountAttackRequests,
|
||||
AttackBytes: item.AttackBytes,
|
||||
CreatedAt: types.Int64(pieces[0]),
|
||||
}
|
||||
if !shouldTrim {
|
||||
pbDomainStats = append(pbDomainStats, pbItem)
|
||||
} else {
|
||||
tempItems = append(tempItems, pbItem)
|
||||
}
|
||||
}
|
||||
|
||||
if shouldTrim {
|
||||
sort.Slice(tempItems, func(i, j int) bool {
|
||||
return tempItems[i].CountRequests > tempItems[j].CountRequests
|
||||
})
|
||||
|
||||
pbDomainStats = append(pbDomainStats, tempItems[:maxDomainsPerServer]...)
|
||||
}
|
||||
pbDomainStats = append(pbDomainStats, &pb.UploadServerDailyStatsRequest_DomainStat{
|
||||
ServerId: types.Int64(pieces[1]),
|
||||
Domain: pieces[2],
|
||||
Bytes: item.Bytes,
|
||||
CachedBytes: item.CachedBytes,
|
||||
CountRequests: item.CountRequests,
|
||||
CountCachedRequests: item.CountCachedRequests,
|
||||
CountAttackRequests: item.CountAttackRequests,
|
||||
AttackBytes: item.AttackBytes,
|
||||
CreatedAt: types.Int64(pieces[0]),
|
||||
})
|
||||
}
|
||||
|
||||
// 历史未提交记录
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package stats
|
||||
|
||||
import (
|
||||
"github.com/iwind/TeaGo/rands"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"runtime"
|
||||
"testing"
|
||||
)
|
||||
@@ -16,7 +18,7 @@ func TestTrafficStatManager_Add(t *testing.T) {
|
||||
func TestTrafficStatManager_Upload(t *testing.T) {
|
||||
manager := NewTrafficStatManager()
|
||||
for i := 0; i < 100; i++ {
|
||||
manager.Add(1, "goedge.cn", 1, 0, 0, 0, 0, 0, false, 0)
|
||||
manager.Add(1, "goedge.cn"+types.String(rands.Int(0, 10)), 1, 0, 1, 0, 0, 0, false, 0)
|
||||
}
|
||||
err := manager.Upload()
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user