Files
EdgeNode/internal/remotelogs/utils.go

219 lines
4.4 KiB
Go
Raw Normal View History

package remotelogs
2020-10-09 11:06:43 +08:00
import (
2021-11-30 16:43:58 +08:00
"encoding/json"
2020-10-09 11:06:43 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
"github.com/TeaOSLab/EdgeNode/internal/rpc"
"github.com/TeaOSLab/EdgeNode/internal/trackers"
"github.com/cespare/xxhash"
2021-12-01 15:52:38 +08:00
"github.com/iwind/TeaGo/Tea"
2020-10-09 11:06:43 +08:00
"github.com/iwind/TeaGo/logs"
2021-11-30 16:43:58 +08:00
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
"strings"
2020-10-09 11:06:43 +08:00
"time"
)
var logChan = make(chan *pb.NodeLog, 1024)
func init() {
// 定期上传日志
ticker := time.NewTicker(60 * time.Second)
2021-12-01 15:52:38 +08:00
if Tea.IsTesting() {
ticker = time.NewTicker(10 * time.Second)
}
2020-10-09 11:06:43 +08:00
go func() {
for range ticker.C {
var tr = trackers.Begin("UPLOAD_REMOTE_LOGS")
2020-10-09 11:06:43 +08:00
err := uploadLogs()
tr.End()
2020-10-09 11:06:43 +08:00
if err != nil {
logs.Println("[LOG]" + err.Error())
}
}
}()
}
2021-05-23 20:45:14 +08:00
// Println 打印普通信息
2020-10-09 11:06:43 +08:00
func Println(tag string, description string) {
logs.Println("[" + tag + "]" + description)
select {
case logChan <- &pb.NodeLog{
Role: teaconst.Role,
Tag: tag,
Description: description,
Level: "info",
2021-11-30 16:43:58 +08:00
NodeId: teaconst.NodeId,
2020-10-09 11:06:43 +08:00
CreatedAt: time.Now().Unix(),
}:
default:
}
}
2021-05-23 20:45:14 +08:00
// Warn 打印警告信息
2020-10-09 11:06:43 +08:00
func Warn(tag string, description string) {
logs.Println("[" + tag + "]" + description)
select {
case logChan <- &pb.NodeLog{
Role: teaconst.Role,
Tag: tag,
Description: description,
Level: "warning",
2021-11-30 16:43:58 +08:00
NodeId: teaconst.NodeId,
2020-10-09 11:06:43 +08:00
CreatedAt: time.Now().Unix(),
}:
default:
}
}
2021-05-23 20:45:14 +08:00
// Error 打印错误信息
2020-10-09 11:06:43 +08:00
func Error(tag string, description string) {
logs.Println("[" + tag + "]" + description)
// 忽略RPC连接错误
var level = "error"
if strings.Contains(description, "code = Unavailable desc = connection closed") {
level = "warning"
}
2020-10-09 11:06:43 +08:00
select {
case logChan <- &pb.NodeLog{
Role: teaconst.Role,
Tag: tag,
Description: description,
Level: level,
2021-11-30 16:43:58 +08:00
NodeId: teaconst.NodeId,
2020-10-09 11:06:43 +08:00
CreatedAt: time.Now().Unix(),
}:
default:
}
}
2021-11-10 21:51:56 +08:00
// ErrorObject 打印错误对象
func ErrorObject(tag string, err error) {
if err == nil {
return
}
if rpc.IsConnError(err) {
Warn(tag, err.Error())
} else {
Error(tag, err.Error())
}
}
// ServerError 打印服务相关错误信息
2021-11-30 16:43:58 +08:00
func ServerError(serverId int64, tag string, description string, logType nodeconfigs.NodeLogType, params maps.Map) {
2021-05-23 20:45:14 +08:00
logs.Println("[" + tag + "]" + description)
2021-11-30 16:43:58 +08:00
// 参数
var paramsJSON []byte
if len(params) > 0 {
p, err := json.Marshal(params)
if err != nil {
logs.Println("[LOG]" + err.Error())
} else {
paramsJSON = p
}
2021-05-23 20:45:14 +08:00
}
select {
case logChan <- &pb.NodeLog{
Role: teaconst.Role,
Tag: tag,
Description: description,
Level: "error",
2021-11-30 16:43:58 +08:00
NodeId: teaconst.NodeId,
2021-05-23 20:45:14 +08:00
ServerId: serverId,
CreatedAt: time.Now().Unix(),
2021-11-30 16:43:58 +08:00
Type: logType,
ParamsJSON: paramsJSON,
2021-05-23 20:45:14 +08:00
}:
default:
}
}
// ServerSuccess 打印服务相关成功信息
2021-11-30 16:43:58 +08:00
func ServerSuccess(serverId int64, tag string, description string, logType nodeconfigs.NodeLogType, params maps.Map) {
logs.Println("[" + tag + "]" + description)
2021-11-30 16:43:58 +08:00
// 参数
var paramsJSON []byte
if len(params) > 0 {
p, err := json.Marshal(params)
if err != nil {
logs.Println("[LOG]" + err.Error())
} else {
paramsJSON = p
}
}
select {
case logChan <- &pb.NodeLog{
Role: teaconst.Role,
Tag: tag,
Description: description,
Level: "success",
2021-11-30 16:43:58 +08:00
NodeId: teaconst.NodeId,
ServerId: serverId,
CreatedAt: time.Now().Unix(),
2021-11-30 16:43:58 +08:00
Type: logType,
ParamsJSON: paramsJSON,
}:
default:
}
}
2020-10-09 11:06:43 +08:00
// 上传日志
func uploadLogs() error {
logList := []*pb.NodeLog{}
const hashSize = 5
var hashList = []uint64{}
2020-10-09 11:06:43 +08:00
Loop:
for {
select {
case log := <-logChan:
// 是否已存在
var hash = xxhash.Sum64String(types.String(log.ServerId) + "_" + log.Description)
var found = false
for _, h := range hashList {
if h == hash {
found = true
break
}
}
// 加入
if !found {
hashList = append(hashList, hash)
if len(hashList) > hashSize {
hashList = hashList[1:]
}
logList = append(logList, log)
}
2020-10-09 11:06:43 +08:00
default:
break Loop
}
}
if len(logList) == 0 {
return nil
}
rpcClient, err := rpc.SharedRPC()
if err != nil {
return err
}
_, err = rpcClient.NodeLogRPC().CreateNodeLogs(rpcClient.Context(), &pb.CreateNodeLogsRequest{NodeLogs: logList})
return err
}