147 lines
4.3 KiB
Go
147 lines
4.3 KiB
Go
package svc
|
||
|
||
import (
|
||
"encoding/gob"
|
||
"errors"
|
||
"fmt"
|
||
"net/rpc"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/globalsign/mgo"
|
||
"github.com/globalsign/mgo/bson"
|
||
"mongo.games.com/game/dbproxy/mongo"
|
||
"mongo.games.com/game/mgrsrv/api"
|
||
"mongo.games.com/game/model"
|
||
rpcx "mongo.games.com/game/rpc"
|
||
"mongo.games.com/game/webapi"
|
||
"mongo.games.com/goserver/core/basic"
|
||
"mongo.games.com/goserver/core/logger"
|
||
"mongo.games.com/goserver/core/netlib"
|
||
"mongo.games.com/goserver/core/profile"
|
||
"mongo.games.com/goserver/core/schedule"
|
||
"mongo.games.com/goserver/core/transact"
|
||
"mongo.games.com/goserver/core/utils"
|
||
)
|
||
|
||
var (
|
||
MonitorErr = errors.New("monitor_data open failed.")
|
||
)
|
||
|
||
func MonitorDataCollection(cname string) *mongo.Collection {
|
||
s := mongo.MgoSessionMgrSington.GetGlobal(model.MonitorDBName)
|
||
if s != nil {
|
||
c, first := s.DB().C(fmt.Sprintf("%v_%v", model.MonitorPrefixName, strings.ToLower(cname)))
|
||
if first {
|
||
c.EnsureIndex(mgo.Index{Key: []string{"srvid"}, Background: true, Sparse: true})
|
||
c.EnsureIndex(mgo.Index{Key: []string{"srvtype"}, Background: true, Sparse: true})
|
||
c.EnsureIndex(mgo.Index{Key: []string{"key"}, Background: true, Sparse: true})
|
||
c.EnsureIndex(mgo.Index{Key: []string{"time"}, Background: true, Sparse: true})
|
||
}
|
||
return c
|
||
}
|
||
return nil
|
||
}
|
||
|
||
type MonitorDataSvc struct {
|
||
}
|
||
|
||
func (svc *MonitorDataSvc) InsertMonitorData(args *model.MonitorDataArg, ret *bool) (err error) {
|
||
clog := MonitorDataCollection(args.Name)
|
||
if clog == nil {
|
||
return
|
||
}
|
||
|
||
err = clog.Insert(args.Log)
|
||
if err != nil {
|
||
logger.Logger.Warnf("InsertMonitorData(%v) error:%v", args.Name, err)
|
||
return
|
||
}
|
||
*ret = true
|
||
return
|
||
}
|
||
|
||
func (svc *MonitorDataSvc) UpsertMonitorData(args *model.MonitorDataArg, ret *bool) (err error) {
|
||
clog := MonitorDataCollection(args.Name)
|
||
if clog == nil {
|
||
return
|
||
}
|
||
|
||
var existLog model.MonitorData
|
||
err = clog.Find(bson.M{"srvid": args.Log.SrvId, "srvtype": args.Log.SrvType, "key": args.Log.Key}).One(&existLog)
|
||
if err == nil {
|
||
args.Log.LogId = existLog.LogId
|
||
err = clog.Update(bson.M{"_id": args.Log.LogId}, args.Log)
|
||
if err != nil {
|
||
logger.Logger.Warnf("UpsertMonitorData(%v) Update error:%v", args.Name, err)
|
||
return
|
||
}
|
||
} else {
|
||
if err == mgo.ErrNotFound {
|
||
err = clog.Insert(args.Log)
|
||
if err != nil {
|
||
logger.Logger.Warnf("UpsertMonitorData(%v) Insert error:%v", args.Name, err)
|
||
return
|
||
}
|
||
}
|
||
}
|
||
*ret = true
|
||
return
|
||
}
|
||
|
||
func (svc *MonitorDataSvc) RemoveMonitorData(t time.Time, changes *[]*mgo.ChangeInfo) (err error) {
|
||
s := mongo.MgoSessionMgrSington.GetGlobal(model.MonitorDBName)
|
||
if s != nil {
|
||
db := s.DB()
|
||
if db != nil {
|
||
cnames, err := db.CollectionNames()
|
||
if err == nil {
|
||
if len(cnames) != 0 {
|
||
for _, name := range cnames {
|
||
c, _ := db.C(name)
|
||
if c != nil {
|
||
chginfo, err := c.RemoveAll(bson.M{"time": bson.M{"$lt": t}})
|
||
if err == nil {
|
||
*changes = append(*changes, chginfo)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
func init() {
|
||
//gob registe
|
||
// gob:go语言特有的编解码工具,Register需要在初始化时或提前调用
|
||
// rpc编解码依赖gob,rpc需要知道怎么编解码接口数据(客户端服务端都需要知道),以下结构体在rpc参数中被转成了interface,所以这里需要告诉gob接口类型的具体结构
|
||
gob.Register(model.PlayerOLStats{})
|
||
gob.Register(map[string]*model.APITransactStats{})
|
||
gob.Register(api.ApiStats{}) // 这里依赖了mgrsrv的结构体,会导致mgrsrv初始化,最好是把结构体放到一个公共包里,不要两个不相关的程序有直接依赖
|
||
gob.Register(map[string]api.ApiStats{})
|
||
gob.Register(webapi.ApiStats{})
|
||
gob.Register(map[string]webapi.ApiStats{})
|
||
gob.Register(mgo.Stats{})
|
||
gob.Register(profile.TimeElement{})
|
||
gob.Register(map[string]profile.TimeElement{})
|
||
gob.Register(netlib.ServiceStats{})
|
||
gob.Register(map[int]netlib.ServiceStats{})
|
||
gob.Register(schedule.TaskStats{})
|
||
gob.Register(map[string]schedule.TaskStats{})
|
||
gob.Register(transact.TransStats{})
|
||
gob.Register(map[int]transact.TransStats{})
|
||
gob.Register(utils.PanicStackInfo{})
|
||
gob.Register(map[string]utils.PanicStackInfo{})
|
||
gob.Register(basic.CmdStats{})
|
||
gob.Register(map[string]basic.CmdStats{})
|
||
gob.Register(utils.RuntimeStats{})
|
||
gob.Register(rpcx.State{})
|
||
gob.Register(map[string]rpcx.State{})
|
||
|
||
//gob registe
|
||
|
||
rpc.Register(new(MonitorDataSvc))
|
||
}
|