修复HTTPS连接无法记录带宽的问题,优化带宽计算方法
This commit is contained in:
@@ -17,6 +17,8 @@ import (
|
||||
|
||||
var SharedBandwidthStatManager = NewBandwidthStatManager()
|
||||
|
||||
const bandwidthTimestampDelim = 2 // N秒平均,更为精确
|
||||
|
||||
func init() {
|
||||
events.On(events.EventLoaded, func() {
|
||||
goman.New(func() {
|
||||
@@ -83,7 +85,7 @@ func (this *BandwidthStatManager) Loop() error {
|
||||
ServerId: stat.ServerId,
|
||||
Day: stat.Day,
|
||||
TimeAt: stat.TimeAt,
|
||||
Bytes: stat.MaxBytes,
|
||||
Bytes: stat.MaxBytes / bandwidthTimestampDelim,
|
||||
})
|
||||
delete(this.m, key)
|
||||
}
|
||||
@@ -112,11 +114,18 @@ func (this *BandwidthStatManager) Add(userId int64, serverId int64, bytes int64)
|
||||
}
|
||||
|
||||
var now = time.Now()
|
||||
var timestamp = now.Unix()
|
||||
var timestamp = now.Unix() / bandwidthTimestampDelim * bandwidthTimestampDelim // 将时间戳均分成N等份
|
||||
var day = timeutil.Format("Ymd", now)
|
||||
var timeAt = timeutil.FormatTime("Hi", now.Unix()/300*300)
|
||||
var key = types.String(serverId) + "@" + day + "@" + timeAt
|
||||
|
||||
// 增加TCP Header尺寸,这里默认MTU为1500,且默认为IPv4
|
||||
const mtu = 1500
|
||||
const tcpHeaderSize = 20
|
||||
if bytes > mtu {
|
||||
bytes += bytes * tcpHeaderSize / mtu
|
||||
}
|
||||
|
||||
this.locker.Lock()
|
||||
stat, ok := this.m[key]
|
||||
if ok {
|
||||
@@ -150,3 +159,15 @@ func (this *BandwidthStatManager) Inspect() {
|
||||
logs.PrintAsJSON(this.m)
|
||||
this.locker.Unlock()
|
||||
}
|
||||
|
||||
func (this *BandwidthStatManager) Map() map[int64]int64 /** serverId => max bytes **/ {
|
||||
this.locker.Lock()
|
||||
defer this.locker.Unlock()
|
||||
|
||||
var m = map[int64]int64{}
|
||||
for _, v := range this.m {
|
||||
m[v.ServerId] = v.MaxBytes / bandwidthTimestampDelim
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ func TestBandwidthStatManager_Add(t *testing.T) {
|
||||
manager.Add(1, 1, 10)
|
||||
manager.Add(1, 1, 10)
|
||||
time.Sleep(1 * time.Second)
|
||||
manager.Add(1, 1, 15)
|
||||
manager.Add(1, 1, 85)
|
||||
time.Sleep(1 * time.Second)
|
||||
manager.Add(1, 1, 25)
|
||||
manager.Add(1, 1, 75)
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
package stats
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/iplibrary"
|
||||
iplib "github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
_ "github.com/iwind/TeaGo/bootstrap"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestHTTPRequestStatManager_Loop_Region(t *testing.T) {
|
||||
library, err := iplibrary.SharedManager.Load()
|
||||
err := iplib.InitDefault()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
iplibrary.SharedLibrary = library
|
||||
|
||||
manager := NewHTTPRequestStatManager()
|
||||
var manager = NewHTTPRequestStatManager()
|
||||
manager.AddRemoteAddr(11, "202.196.0.20", 0, false)
|
||||
manager.AddRemoteAddr(11, "202.196.0.20", 0, false) // 重复添加一个测试相加
|
||||
manager.AddRemoteAddr(11, "8.8.8.8", 0, false)
|
||||
@@ -36,19 +36,13 @@ func TestHTTPRequestStatManager_Loop_Region(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHTTPRequestStatManager_Loop_UserAgent(t *testing.T) {
|
||||
library, err := iplibrary.SharedManager.Load()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
iplibrary.SharedLibrary = library
|
||||
|
||||
manager := NewHTTPRequestStatManager()
|
||||
var manager = NewHTTPRequestStatManager()
|
||||
manager.AddUserAgent(1, "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36")
|
||||
manager.AddUserAgent(1, "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36")
|
||||
manager.AddUserAgent(1, "Mozilla/5.0 (Macintosh; Intel Mac OS X 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76 Safari/537.36")
|
||||
manager.AddUserAgent(1, "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36")
|
||||
manager.AddUserAgent(1, "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
|
||||
err = manager.Loop()
|
||||
err := manager.Loop()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user