Files
EdgeNode/internal/nodes/http_access_log_queue.go

101 lines
2.1 KiB
Go
Raw Normal View History

2020-10-10 11:47:53 +08:00
package nodes
import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
2020-10-10 11:47:53 +08:00
"github.com/TeaOSLab/EdgeNode/internal/rpc"
"strconv"
2020-10-10 11:47:53 +08:00
"time"
)
var sharedHTTPAccessLogQueue = NewHTTPAccessLogQueue()
2021-08-25 16:46:05 +08:00
// HTTPAccessLogQueue HTTP访问日志队列
2020-10-10 11:47:53 +08:00
type HTTPAccessLogQueue struct {
queue chan *pb.HTTPAccessLog
}
2021-08-25 16:46:05 +08:00
// NewHTTPAccessLogQueue 获取新对象
2020-10-10 11:47:53 +08:00
func NewHTTPAccessLogQueue() *HTTPAccessLogQueue {
2021-08-25 16:46:05 +08:00
// 队列中最大的值,超出此数量的访问日志会被丢弃
2020-10-10 11:47:53 +08:00
// TODO 需要可以在界面中设置
maxSize := 20000
2020-10-10 11:47:53 +08:00
queue := &HTTPAccessLogQueue{
queue: make(chan *pb.HTTPAccessLog, maxSize),
}
go queue.Start()
return queue
}
2021-08-25 16:46:05 +08:00
// Start 开始处理访问日志
2020-10-10 11:47:53 +08:00
func (this *HTTPAccessLogQueue) Start() {
ticker := time.NewTicker(1 * time.Second)
for range ticker.C {
err := this.loop()
if err != nil {
remotelogs.Error("ACCESS_LOG_QUEUE", err.Error())
2020-10-10 11:47:53 +08:00
}
}
}
2021-08-25 16:46:05 +08:00
// Push 加入新访问日志
2020-10-10 11:47:53 +08:00
func (this *HTTPAccessLogQueue) Push(accessLog *pb.HTTPAccessLog) {
select {
case this.queue <- accessLog:
default:
}
}
// 上传访问日志
func (this *HTTPAccessLogQueue) loop() error {
var accessLogs = []*pb.HTTPAccessLog{}
var count = 0
var timestamp int64
var requestId = 1_000_000
2020-10-10 11:47:53 +08:00
Loop:
for {
select {
case accessLog := <-this.queue:
if accessLog.Timestamp > timestamp {
requestId = 10_000_000
timestamp = accessLog.Timestamp
} else {
requestId++
}
// timestamp + requestId + nodeId
accessLog.RequestId = strconv.FormatInt(accessLog.Timestamp, 10) + strconv.Itoa(requestId) + strconv.FormatInt(accessLog.NodeId, 10)
2020-10-10 11:47:53 +08:00
accessLogs = append(accessLogs, accessLog)
count++
// 每次只提交 N 条访问日志,防止网络拥堵
if count > 2000 {
2020-10-10 11:47:53 +08:00
break Loop
}
default:
break Loop
}
}
if len(accessLogs) == 0 {
return nil
}
// 发送到API
client, err := rpc.SharedRPC()
if err != nil {
return err
}
2021-06-01 19:52:37 +08:00
_, err = client.HTTPAccessLogRPC().CreateHTTPAccessLogs(client.Context(), &pb.CreateHTTPAccessLogsRequest{HttpAccessLogs: accessLogs})
2020-10-10 11:47:53 +08:00
if err != nil {
return err
}
return nil
}