165 lines
3.9 KiB
Go
165 lines
3.9 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/globalsign/mgo"
|
|
"github.com/globalsign/mgo/bson"
|
|
"mongo.games.com/goserver/core/basic"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/task"
|
|
|
|
"mongo.games.com/game/common"
|
|
)
|
|
|
|
var (
|
|
MonitorDBName = "monitor"
|
|
MonitorPrefixName = "m"
|
|
)
|
|
|
|
type MonitorData struct {
|
|
LogId bson.ObjectId `bson:"_id"`
|
|
SrvId int32 //服务器id
|
|
SrvType int32 //服务器类型
|
|
Key string //自定义key
|
|
Time time.Time //时间戳
|
|
Data interface{} //数据体
|
|
}
|
|
|
|
func NewMonitorData(srvid, srvtype int32, key string, data interface{}) *MonitorData {
|
|
log := &MonitorData{
|
|
LogId: bson.NewObjectId(),
|
|
SrvId: srvid,
|
|
SrvType: srvtype,
|
|
Key: key,
|
|
Data: data,
|
|
Time: time.Now(),
|
|
}
|
|
return log
|
|
}
|
|
|
|
type MonitorDataArg struct {
|
|
Name string
|
|
Log *MonitorData
|
|
}
|
|
|
|
func InsertMonitorData(name string, log *MonitorData) (err error) {
|
|
if rpcCli == nil {
|
|
logger.Logger.Error("model.InsertMonitorData rpcCli == nil")
|
|
return
|
|
}
|
|
args := &MonitorDataArg{
|
|
Name: name,
|
|
Log: log,
|
|
}
|
|
var ret bool
|
|
err = rpcCli.CallWithTimeout("MonitorDataSvc.InsertMonitorData", args, &ret, time.Second*30)
|
|
if err != nil {
|
|
logger.Logger.Warn("InsertMonitorData error:", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func UpsertMonitorData(name string, log *MonitorData) (err error) {
|
|
if rpcCli == nil {
|
|
logger.Logger.Error("model.UpsertMonitorData rpcCli == nil")
|
|
return
|
|
}
|
|
args := &MonitorDataArg{
|
|
Name: name,
|
|
Log: log,
|
|
}
|
|
var ret bool
|
|
err = rpcCli.CallWithTimeout("MonitorDataSvc.UpsertMonitorData", args, &ret, time.Second*30)
|
|
if err != nil {
|
|
logger.Logger.Warn("UpsertMonitorData error:", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func RemoveMonitorData(t time.Time) (chged []*mgo.ChangeInfo, err error) {
|
|
if rpcCli == nil {
|
|
logger.Logger.Error("model.RemoveMonitorData rpcCli == nil")
|
|
return
|
|
}
|
|
err = rpcCli.CallWithTimeout("MonitorDataSvc.RemoveMonitorData", t, &chged, time.Second*30)
|
|
if err != nil {
|
|
logger.Logger.Warn("RemoveMonitorData error:", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
type MonitorTool[T any] struct {
|
|
CollectionName string
|
|
}
|
|
|
|
func NewMonitorTool[T any](collectionName string) *MonitorTool[T] {
|
|
return &MonitorTool[T]{
|
|
CollectionName: collectionName,
|
|
}
|
|
}
|
|
|
|
func (m *MonitorTool[T]) Insert(key string, state *T) {
|
|
d := NewMonitorData(int32(common.GetSelfSrvId()), int32(common.GetSelfSrvType()), key, state)
|
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
return InsertMonitorData(m.CollectionName, d)
|
|
}), nil, "InsertMonitorData").StartByFixExecutor("monitor")
|
|
|
|
}
|
|
|
|
func (m *MonitorTool[T]) InsertKV(kv map[string]*T) {
|
|
// todo 批量插入
|
|
for k, v := range kv {
|
|
m.Insert(k, v)
|
|
}
|
|
}
|
|
|
|
func (m *MonitorTool[T]) Upsert(key string, state *T) {
|
|
d := NewMonitorData(int32(common.GetSelfSrvId()), int32(common.GetSelfSrvType()), key, state)
|
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
return UpsertMonitorData(m.CollectionName, d)
|
|
}), nil, "UpsertMonitorData").StartByFixExecutor("monitor")
|
|
}
|
|
|
|
func (m *MonitorTool[T]) UpsertKV(kv map[string]*T) {
|
|
//todo 批量更新
|
|
for k, v := range kv {
|
|
m.Upsert(k, v)
|
|
}
|
|
}
|
|
|
|
// Remove 清理监控日志
|
|
func Remove(t time.Time) {
|
|
if t.IsZero() {
|
|
return
|
|
}
|
|
|
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
_, err := RemoveMonitorData(t)
|
|
if err != nil {
|
|
logger.Logger.Error("RemoveMonitorData error:", err)
|
|
}
|
|
return nil
|
|
}), nil, "RemoveMonitorData").StartByFixExecutor("monitor")
|
|
}
|
|
|
|
type PlayerOLStats struct {
|
|
PlatformStats map[string]*PlayerStats
|
|
RobotStats PlayerStats
|
|
}
|
|
|
|
type PlayerStats struct {
|
|
InGameCnt map[int32]map[int32]int32
|
|
InHallCnt int32
|
|
}
|
|
|
|
type APITransactStats struct {
|
|
RunTimes int64 //执行次数
|
|
TotalRuningTime int64 //总执行时间
|
|
MaxRuningTime int64 //最长执行时间
|
|
TotalBodyLen int64 //返回体总长度
|
|
MaxBodyLen int //最长返回体长度
|
|
SuccessTimes int64 //执行成功次数
|
|
FailedTimes int64 //执行失败次数
|
|
}
|